设计模式学习笔记(八)模板方法模式

定义

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

要点

  • 模板方法的抽象类可以定义具体方法,抽象方法钩子.
  • 抽象方法由子类实现.
  • 钩子是一种方法,它在抽象类中不做事或者只做默认的事,子类可以选择要不要去覆盖它.
  • 为了防止子类改变模板方法中的算法,在JAVA中可以将模板方法声明为final.
  • 高层和底层组件避免出现明显的环状依赖.
  • 策略模式模板算法模式都封装算法,一个用组合,一个用继承.
  • 工厂方法模板方法的一种特殊版本.

个人理解

我们可以利用模板方法模式,将对象的共同点写到抽象类的具体实现中去,同时JAVA中因为有final这个关键字,子类也无法覆写抽象类的方法,这就保护了算法执行的顺序,同时也保证了抽象类中的具体方法不会被子类所篡改.这个final很骚啊,有些小小的o(一︿一+)o.子类将继承得到的需要改变的方法进行覆写,就可以完成自己的相应的功能,这与策略模式的组合不同,这里使用的是继承,突然有点突发奇想,如果我们使用钩子来对行为进行组合或者选择呢?

学到这个模式,我记忆最为深刻的就是这个hook(钩子)了,以前也接触过,也明白他在做什么,但并不清楚他的定义是什么.我们什么时候该使用钩子,什么时候该使用抽象方法呢?书中是这么回答的:当你的子类必须提供算法中的某个方法或者步骤的实现时,就使用抽象方法.如果算法的这个部分是可选择的,就用钩子.如果是钩子的话,子类可以选择实现这个钩子,但并不强制这么做.我们可以通过这个钩子来改变内部代码的选择执行,甚至可以通过改变这个钩子的代码来完全改变抽象类方法的执行结果!这是我感受最为颇深的一点.

抽象类的方法多少内容需要自己去调节优化到一个合适的程度,如果某些步骤是可选的,所以我们可以将这些方法实现成hook,而不是实现成抽象方法,这样可以让抽象类的子类负荷减轻.

推荐阅读更多精彩内容