设计模式(三)、模板方法设计模式

时间:2024-05-01 07:15:16

模式定义

模板方法模式(Template Method Pattern):定义一个操作中算法的框架而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

模式结构

模板方法模式包含如下角色:
AbstractClass: 抽象类
ConcreteClass:具体子类

模式分析

  1. 是一种基于继承的代码复用技术

  2. 将一些复杂流程的实现步骤封装在一系列基本方法中

  3. 在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果

方法分类

  • 模板方法(Template Method)

  • 基本方法(Primitive Method)

    • 抽象方法(Abstract Method)

    • 具体方法(Concrete Method)

    • 钩子方法(Hook Method)

      • (1)“挂钩”方法:isXXX()或hasXXX(),返回类型为boolean类型
      • (2)空方法

                   代码示例:

//模板方法
public void template(){
    open();
    display();
//通过钩子方法来确定某一步骤是否执行
if(isPrint()){
  print();
 }
}
//钩子方法
public boolean isPrint() {
    return true;
}

模板方法模式的优点

  1. 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
  2. 提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为
  3. 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行
  4. 更换和增加新的子类很方便,符合单一职责原则和开闭原则

模板方法模式的缺点

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统会更加庞大,设计也更加抽象

模板方法模式使用场景 

  1. 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为应被提取出来,并集中到一个公共父类中,以避免代码重复
  3. 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制 

模板方法模式和继承有什么区别 

  • 模板方法设计模式更注重于算法的骨架和步骤的延迟实现,而继承则侧重于类与类之间的关系以及属性和方法的继承。
  • 模板方法设计模式是在算法层面上进行复用和扩展,而继承则是在类层面上进行复用和扩展。
  • 模板方法设计模式通常需要定义抽象类和具体实现类,而继承则是通过子类继承父类来实现。 

模板方法设计模式和策略模式的差异会放到策略模式的文章中 

因为项目架构优化,部分算法实现用到了模板方法设计模式,写了这个文章。如有错误或需要调整的地方请留言。