模板方法模式 - 封装算法
星巴克咖啡师傅训练手册,从中我们发现星巴克的咖啡和茶都采用相同的算法和步骤
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这可以确保算法的结构保持不变,同时由子类提供部分实现。
abstract class AbstractClass
{
final void templateMethod()
{
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
abstract void primitiveOperation1();
abstract void primitiveOperation2();
final void concreteOperation()
{
//这里是实现
}
//这是一个具体的方法,但它什么事情都不做!
void hook() { }
}
什么时候使用钩子呢(hook)?
如果算法的这个部分是可选的,就用钩子。
设计原则
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。
应用
- 应用模板方法排序,ompareTo()。
- JFrame中的paint()。
- Applet类,这个就是管理网页上的小程序的生命周期,子类可以覆盖里面的hook()。
要点
- “模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类。
- 模板方法模式为我们提供了一种代码复用的重要技巧。
- 模板方法的抽象类可以定义具体方法、抽象方法和钩子。
- 为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
- 好莱坞原则告诉我们,将决策权放在高层模块中、以便决定如何以及何时调用底层模块。
- 策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
- 工厂方法是模板方法的一种特殊版本。