设计模式—— 十 :模板方法模式

Posted three-fighter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式—— 十 :模板方法模式相关的知识,希望对你有一定的参考价值。


@


什么是模板方法模式?

模板方法模式(Template Method Pattern)定义如下:

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm‘s structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改 变一个算法的结构即可重定义该算法的某些特定步骤。)

模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。

模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关 系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类 来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一 个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

模板方法模式的通用类图如下:

图10-1:模板方法模式通用类图

技术图片

模板方法模式包含如下两个角色:

  • (1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基 本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中 可以重定义或实现这些步骤。
    它的方法分为两类:

    • 基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
    • 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度, 完成固定的逻辑。
  • (2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作 以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

具体代码:

  • 抽象模板类:
public abstract class AbstractClass { 
  //基本方法 
  protected abstract void doSomething();
  //基本方法 
  protected abstract void doAnything(); 
  //模板方法 
  public void templateMethod(){ 
  /** 调用基本方法,完成相关的逻辑 */ 
  this.doAnything(); this.doSomething(); 
  } 
}

  • 具体模板类:
public class ConcreteClass1 extends AbstractClass { 
   //实现基本方法 
   protected void doAnything() { 
     //业务逻辑处理 
   }
   protected void doSomething() { 
   //业务逻辑处理 
   } 
}

public class ConcreteClass2 extends AbstractClass {
  //实现基本方法 
  protected void doAnything() { 
    //业务逻辑处理 
  }
  protected void doSomething() { 
    //业务逻辑处理 
  } 
}

  • 场景类:
public class Client { 
  public static void main(String[] args) { 
    AbstractClass class1 = new ConcreteClass1(); 
    AbstractClass class2 = new ConcreteClass2(); 
    //调用模板方法 
    class1.templateMethod(); 
    class2.templateMethod(); 
  } 
}

抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露 的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。


模板方法模式的应用


模板方法模式的优点

● 封装不变部分,扩展可变部分 把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。 在悍马模型例子中,是不是就非常容易扩展?例如增加一个H3型号的悍马模型,很容易 呀,增加一个子类,实现父类的基本方法就可以了。

● 提取公共部分代码,便于维护我们例子中刚刚走过的弯路就是最好的证明,如果我们不抽取到父类中,任由这种散乱的代码发生,想想后果是什么样子?维护人员为了修正一个缺陷,需要到处查找类似的代码!

● 行为由父类控制,子类实现 基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。


模板方法模式的缺点

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


模板方法模式的使用场景

● 多个子类有公有的方法,并且逻辑基本相同时。

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

● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。



参考:

【1】:《设计模式之禅》
【2】:《design-pattern-java》
【3】:《研磨设计模式》

以上是关于设计模式—— 十 :模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章

十模板设计模式

六十主动模式和被动模式添加监控主机添加自定义模板处理图形中的乱码自动发现

设计模式模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

《软件需求十步走》阅读笔记4

设计模式——行为型模式(责任链,命令,解释器,迭代器,中介者,备忘录,观察者,状态,空对象,策略,模板,访问者)

设计模式之模板方法模式代码示例