【设计模式】行为型设计模式之 模板方法模式

介绍

GOF 定义

模板方法模式 Template Method Design Pattern :模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中去实现;模板方法在不改变算法整体结构·的情况下,可以重新定义算法中的某些步骤。

代码举例

public abstract class AbstractClass{

    //算法框架方法,使用final避免子类重写
    public final void templateMethod(){
        ...
        method1();
        ...
        method2();
    }
    
    //使用protect保证子类可见,包外不可见
    protect abstract void method1();
    //使用
    protect abstract void method2();
}



public class ConcreteClass2 extends AbstractClass{
    @Override
    protected void method1(){
        ...
        具体实现
    }

    @Override
    protected void method2(){
        ...
        具体实现
    }
}

应用案例

模板方法的作用 1:复用

InputStream 的案例
InputStream 中有一个模板方法,方法签名是read(byte[],int off,int len);其中包含一个抽象方法 read()的调用,这个方法则留待子类去实现。实现了方法 read(byte[],int off,int len); 的复用,不需要每个子类都重复实现。
Java AbstractList 的案例
AbstractList 中的 addAll 方法中调用了 add 方法,这就是一个模板方法,add 的具体实现依赖于子类的实现。虽然 AbstractList 中没有将 add 方法声明为抽象,但是 add 方法在 AbstractList 中直接抛出了异常

public boolean addAll(int index, Collection<? extends E> c) {
    rangeCheckForAdd(index);
    boolean modified = false;
    for (E e : c) {
        add(index++, e);
        modified = true;
    }
    return modified;
}


public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

模板方法的作用 2:拓展点

模板方法还可以用作框架的拓展点,例如 Spring MVC WEB 开发中底层使用的 Servlet 技术
直接使用 Servlet 开发时继承 HttpServlet 类后,手写 doGet 和 doPOst 方法。然后服务请求进入 Servlet 时实际上调用的 service 方法。这个 service 方法就可以看做一个模板方法。

模板方法与回调的对比

相同点

回调方法与模板方法的应用场景几乎一致,都是在一个大的算法框架中自由替换其中的某个步骤,起到代码复用和拓展的作用。

不同点

  1. 回调基于组合关系,而模板方法基于继承实现
  2. 回调的组合关系更加灵活
    1. Java 语言的单继承限制
    2. 回调可以使用匿名类,Lambda 表达式来传递代码。但是模板方法必须定义子类
    3. 模板方法不够灵活,如果有多个模板方法和其待实现方法则实现子类必须都实现一遍。

总结

优点

  • 提高代码复用:不变的部分集中在父类,减少代码重复。
  • 提高扩展性:新增子类时,只需实现特定的方法,无需改动模板方法。
  • 保证一致性:确保算法的整体结构稳定,即使在子类中修改了某些步骤。

缺点

  • 过度使用可能导致类结构复杂,特别是继承层次过深时。
  • 对于不需要重用算法结构的情况,引入模板方法可能会增加不必要的抽象。

相关推荐

  1. 设计模式行为设计模式 模板方法模式

    2024-06-15 04:18:01       11 阅读
  2. 设计模式(015)行为模板方法模式

    2024-06-15 04:18:01       16 阅读
  3. 设计模式行为设计模式——模板方法模式

    2024-06-15 04:18:01       16 阅读
  4. 设计模式(六):模板方法模式(行为模式)

    2024-06-15 04:18:01       25 阅读
  5. 行为设计模式模板模式

    2024-06-15 04:18:01       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 04:18:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 04:18:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 04:18:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 04:18:01       18 阅读

热门阅读

  1. mysql什么时候不需要建立索引

    2024-06-15 04:18:01       6 阅读
  2. 《Python程序设计(第二版)》第一二章冷门点上

    2024-06-15 04:18:01       7 阅读
  3. k8s可练习实验分享

    2024-06-15 04:18:01       9 阅读
  4. m2_python字符串-索引与切片

    2024-06-15 04:18:01       8 阅读
  5. Android10 动态修改开机动画(二)设置分区权限

    2024-06-15 04:18:01       10 阅读
  6. 【xilinx】使用vivado编译中methodology的相关介绍

    2024-06-15 04:18:01       11 阅读
  7. Spring IOC 容器的构建流程?

    2024-06-15 04:18:01       9 阅读