学习资料主要参考: 《Head First 设计模式》
定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
优点
- 模板方法类主导一切,它拥有算法,而且保护这个算法
- 将代码的复用最大化
- 算法只存在与一个地方,易于修改
- 提供了算法框架,子类只需要实现细节算法即可
- 模板方法类专注算法本身,子类专注算法实现
模板方法中的钩子
在定义模板方法的时候,可能会在算法骨架中添加一个方法,这个方法只有空的实现或者默认实现,子类可以自行选择是否覆盖。这个方法就叫做 钩子 。
目的
- 可以让子类选择性实现算法中的可选部分
- 让子类有机会对模板方法中即将发生的动作做出反应
尽量不要把算法切的太细,这样即影响子类灵活度,又增加子类负担。如果某些步骤时可选的,就把它变为钩子,否则就定义为抽象方法。
好莱坞原则
高层组件对低层组件说:别调用我们,我们会调用你。
遵循这个原则可以防止“依赖腐败”,也就是高层组件依赖低层组件,而低层组件又依赖高层组件。这种依赖关系,会增加系统复杂性。
所以在这个原则下,所有低层组件都挂靠在高层组件上,但是使用它们的时机由高层决定。
与依赖倒置原则比较
依赖倒置原则教我们尽量使用抽象类,而不是具体类,而好莱坞原则是在创建框架或组件上的一种技巧。
Java API 中的模板方法模式
Arrays.sort(Object[] array);
只需要让传入的数组对象,实现 Comparable 接口中的 compareTo 方法,就可以使用 Arrays.sort 了。
总结
策略模式和模板方法模式都封装代码,但是一个用组合,一个用继承。
工厂方法是模板方法的一个特殊版本。