定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
角色
抽象类(AbstractClass)
实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass)
实现抽象类中的抽象方法,已完成完整的算法。
类图
示例
模板方法模式算是比较好理解的一种模式。简单示例如下:
public abstract class Template {
public void method() {
step1();
step2();
step3();
}
public abstract void step1();
public void step2() {
System.out.println("this is the second step.");
}
public abstract void step3();
}
public class TemplateA extends Template{
public void step1(){
System.out.println("this is the templateA step1.");
}
public void step3(){
System.out.println("this is the templateA step3");
}
}
public class TemplateB extends Template {
public void step1(){
System.out.println("this is the templateB step1");
}
public void step3(){
System.out.println("this is the templateB step3");
}
}
public class Client {
public static void main(String[] args){
Template template;
template= new TemplateA();
template.method();
template = new TemplateB();
template.method();
}
}
钩子(hook)
在模板模式中,存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。
要点
1.模板方法定义了算法的步骤,把这些步骤的实现延迟到子类
2.为我们提供了一种代码复用的重要技巧
3.抽象类可以定义具体方法、抽象方法和钩子
4.钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
5.为了防止子类改变模板方法中的算法,可以将模板方法声明为final
6.将决策权放在高层模块中,以便决定如何以及何时调用低层模块
7.策略模式和模板方法模式都封装算法,一个用组合,一个用继承
8.工厂方法是模板方法的一种特殊版本
引申
OO另类原则:别调用我们(高层组件),我们会调用你(低层组件)。