Template Method Patterns
Gof定义:把某个操作中的算法骨架定义好,将一些步骤下放到一些子类。模板方法模式允许在不改变算法结构的前提下让子类来重新定义一个算法的某些步骤
概念
在模板方法中,定义一个算法的最精简且最重要(essential)的结构,然后将一些功能放在子类去实现。并且在子类中重新定义算法的一些步骤并且不改变(最重要的)算法结构
例子
现实世界:做一个pizza,总的制作步骤是不变的,但是加别的原料是可以变化的(好像GoF的设计模式书也是这个例子)
代码世界:(也是现实世界的例子)大学生前期的课程总是相对固定的,在后期才会根据不同方向选择不同的专业课程
展示
工科学生必须学习数学和软技术(soft skill--沟通技巧类似),而电气和计算机学生会学一些专业技能
代码
public class TemplateMethodEx {
public static void main(String[] args) {
System.out.println("***Template Method Pattern Demo***\n");
BasicEngineering bs = new ComputerScience();
System.out.println("Computer Sc Papers:");
bs.papers();
System.out.println();
bs = new Electronics();
System.out.println("Electronics Papers:");
bs.papers();
}
}
abstract class BasicEngineering {
// 要毕业需要完成的学习
public void papers() {
math();
softSkills();
specialSkills();
}
// 必须做的事情,事先定义好
private void math() {
System.out.println("Mathematics");
}
private void softSkills() {
System.out.println("SoftSkills");
}
abstract public void specialSkills();
}
class ComputerScience extends BasicEngineering
{
@Override
public void specialSkills() {
System.out.println("Object Oriented Programming");
}
}
class Electronics extends BasicEngineering
{
@Override
public void specialSkills() {
System.out.println("Digital Logic and Circuit Theory");
}
}
Note
- 这个(模板)方法的目的就是代码重用
- GoF建议在这个模式的实现中要准确区分哪些方式是
hook method
(自由选择是否重写)哪些方法是abstract method
(必须重写)
这个模式的注意点是什么?
要保持abstract method
的数量尽可能少,如果有大量的实现方法,那么可能并不适用这种模式,因为体现不出抽象类(模板)的意义