Walt You - 行是知之始

《HeadFirst设计模式》学习日志(八):模板方法模式

2019-03-01


学习资料主要参考: 《Head First 设计模式》



定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

优点

  • 模板方法类主导一切,它拥有算法,而且保护这个算法
  • 将代码的复用最大化
  • 算法只存在与一个地方,易于修改
  • 提供了算法框架,子类只需要实现细节算法即可
  • 模板方法类专注算法本身,子类专注算法实现

模板方法中的钩子

在定义模板方法的时候,可能会在算法骨架中添加一个方法,这个方法只有空的实现或者默认实现,子类可以自行选择是否覆盖。这个方法就叫做 钩子

目的

  • 可以让子类选择性实现算法中的可选部分
  • 让子类有机会对模板方法中即将发生的动作做出反应

尽量不要把算法切的太细,这样即影响子类灵活度,又增加子类负担。如果某些步骤时可选的,就把它变为钩子,否则就定义为抽象方法。

好莱坞原则

高层组件对低层组件说:别调用我们,我们会调用你。

遵循这个原则可以防止“依赖腐败”,也就是高层组件依赖低层组件,而低层组件又依赖高层组件。这种依赖关系,会增加系统复杂性。

所以在这个原则下,所有低层组件都挂靠在高层组件上,但是使用它们的时机由高层决定。

与依赖倒置原则比较

依赖倒置原则教我们尽量使用抽象类,而不是具体类,而好莱坞原则是在创建框架或组件上的一种技巧。

Java API 中的模板方法模式

Arrays.sort(Object[] array);

只需要让传入的数组对象,实现 Comparable 接口中的 compareTo 方法,就可以使用 Arrays.sort 了。

总结

策略模式和模板方法模式都封装代码,但是一个用组合,一个用继承。

工厂方法是模板方法的一个特殊版本。


Content