模板方法模式:
在一个方法中定义一个算法的骨架,并将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
增加一个hook()方法后
注意:
此处的hook()(钩子)是一种被声明在抽象类中的方法,但是只有空的或默认的实现。hook()的存在可以让子类能够对算法的不同点进行挂钩。而要不要挂钩,由子类自己决定。例:
通过在子类中覆盖钩子,来使用它。此处钩子的作用是判断饮料中是否要加入调料。
设计原则:
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你
即:允许底层组件将自己挂钩到系统上,但是高层组件会觉得什么时候怎么样使用这些底层组件。
区别各个模式:
模板方法模式:子类决定如何实现算法中的某些步骤
策略模式:封装可互换的行为,然后使用委托来决定要采用哪一个行为
工厂方法模式:由子类觉得实例化哪个具体类
要点:
(1)“模板方法”定义了算法的步骤,并把这些步骤的实现延迟到子类。
(2)模板方法的抽象类可以定义具体方法、抽象方法和钩子。
(3)抽象方法由子类实现。
(4)钩子是一种方法,他在抽象类中不做任何事,或只做默认的事情,子类可以选择要不要覆盖它。
(5)为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
(6)好莱坞原则:将决策权放在高层模块中,以便决定何时、如何调用底层模块。
(7)策略模式和模板方法都封装算法,但是前者用组合,后者用继承。
(8)工厂方法是模板方法的一种特殊版本。