zoukankan      html  css  js  c++  java
  • JAVA设计模式之模板方法

    1.模板方法的介绍

      模板方法模式是基于继承的设计模式,它定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。

      如果你需要采用某个算法的框架,同时又希望有一定的灵活度,能对它的某些部分进行改进,那么采用模板方法设计模式是比较通用的方案。

    2.模板方法的结构

      模板方法模式主要由两部分结构组成:抽象父类和具体的实现子类

        a.抽象父类:封装了子类的算法框架,包括一些公共方法以及封装子类中所有重写方法的执行顺序;

        b.具体实现子类:继承整个抽象类,也继承了整个算法的结构,可以选择性的重写父类的方法。

     

    3.模板方法的应用

      a.多个子类有共有的方法,且处理逻辑基本相同.

      b.重要、复杂的算法,可以把核心算法设计为模板方法,相关的细节功能则由各个子类自行实现.

      c.重构时,模板方法设计经常被用到,把相同的代码抽取到父类中,然后通过构造函数约束其行为.

    4.模板方法Demo

      假如现在有一个需求,项目需要对接电话平台,目前对接的是华为和联通,你所负责的是需要提供一个回调接口给关联方进行回调,将回调数据进行处理然后落库。

      Controller层:

     1 /**
     2  * @author lyh
     3  * @version v-1.0.0
     4  * @since 2021/6/4
     5  */
     6 @RestController
     7 @RequestMapping("/back")
     8 public class CallBackController {
     9 
    10     @Autowired
    11     @Qualifier("lt")
    12     private CallBackService ltService;
    13 
    14     @Autowired
    15     @Qualifier("hw")
    16     private CallBackService hwService;
    17 
    18     @PostMapping("/hw")
    19     public void hw(@RequestBody CallInfo req) {
    20         hwService.execute(req);
    21     }
    22 
    23     @PostMapping("/lt")
    24     public void lt(@RequestBody CallInfo req) {
    25         ltService.execute(req);
    26     }
    27 
    28 }

      Service层:

     1 public abstract class CallBackService {
     2 
     3     // 算法框架 这里只列举两个步骤
     4     public void execute(CallInfo req) {
     5         // 1.校验数据
     6         this.validate(req);
     7         // 2.执行回调
     8         this.callBack(req);
     9         System.out.println(req.getSource() + "执行完毕!");
    10     }
    11 
    12     protected abstract void validate(CallInfo req);
    13 
    14     protected abstract void callBack(CallInfo dto);
    15 
    16 }

      实现类:

     1 @Service("hw")
     2 public class HwCallBackImpl extends CallBackService {
     3     @Override
     4     protected void validate(CallInfo req) {
     5         System.out.println("华为参数校验通过");
     6     }
     7 
     8     @Override
     9     protected void callBack(CallInfo dto) {
    10         System.out.println("华为话单回调完毕!");
    11     }
    12 }
    13 
    14 //在子类中可以增加一些子类特有的行为,灵活扩张
    15 ----------------------------------------------------------
    16     
    17 @Service("lt")
    18 public class LtCallBackImpl extends CallBackService {
    19 
    20     @Override
    21     protected void validate(CallInfo req) {
    22         System.out.println("联通参数校验通过");
    23     }
    24 
    25     @Override
    26     protected void callBack(CallInfo dto) {
    27         System.out.println("联通话单回调完毕!");
    28     }
    29 }

    5.模板方法的优缺点

    优点:

      a.封装了代码中不变的部分, 灵活扩展可变部分. 把认为不变部分的算法封装到抽象类中(父类), 可变部分通过继承的子类来实现, 扩展灵活, 满足用户多变的需求.

      b.行为的执行步骤由父类来控制, 子类来实现.

      c.抽象类中是公共代码框架, 便于维护.

    缺点:

      a.算法的框架需要改变的时候, 需要修改抽象类.

      b.按照设计习惯, 抽象类负责声明最抽象、最一般的事务属性和方法,实现类负责完成具体的事务属性和方法, 但是模板方法设计正好相反, 子类执行的结果影响了父类的结果, 在复杂的项目中可能会带来代码阅读的难度.

  • 相关阅读:
    Redis面试题(46题)
    公共组件及脚手架webpack模板
    css3中@font-face模块自定义字体
    字段加密实践(django-fernet-fields)
    django导入导出excel实践
    vue-loader和单页组件介绍
    Axios介绍和使用
    微服务架构理解及微服务架构局限性
    v-model的双向数据绑定(表单)
    eureka集群
  • 原文地址:https://www.cnblogs.com/lu97/p/14848693.html
Copyright © 2011-2022 走看看