行云流水's Bolg

第八章:模板方法模式 - Head First 设计模式

模板方法模式

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

策略模式和模板方法模式都封装算法,策略用组合,模板用继承。

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

模式类图:p289图

p289图

扩展:使用钩子(hook)

钩子是一种被声明在抽象类中的方法,只有默认实现。钩子的存在可让子类有能力对算法的不同点进行挂钩。要不要hook,由子类决定。p292代码

当你的子类必须实现某个方法/步骤时,就把方法声明成abstract的。如果算法的这个部分是可选的,就使用钩子。

p292图

典型应用
  1. Java中用来排序的Comparable接口,compareTo()方法。排序方法定义了排序算法的主要步骤,而把compare步骤的实现以compareTo()钩子的形式留给具体类。
  2. Swing:JFrame的paint()方法是个钩子,不做任何事情,子类通过覆盖paint(),可以将自己的代码插入JFrame的算法中。p306代码。
  3. Applet:具体applet大量使用钩子提供行为。p307代码。

p306图 p307图

例子:星巴克咖啡/茶冲泡

不太好的设计1:p280图

p280图

缺点:忽略了2种饮料冲泡过程的一些其他相似点。

模板方法的设计:p283代码

p283图

  1. 父类拥有算法,专注于算法本身,保护这个算法,由子类提供完整实现。
  2. 算法只存在于一个地方,容易修改。
  3. 模板方法提供了框架,可让其他咖啡因饮料插进来。新饮料只要实现自己的方法就可以。

设计原则

设计原则n:好莱坞原则,别调用(打电话给)我们,我们会调用(打电话给)你。

好莱坞原则提供了一种防止“依赖腐败”的方法。

依赖腐败:当高层组件依赖低层组件,而低层组件又依赖高层组件,而高层组件有依赖边侧组件,而边侧组件又依赖低层组件时,依赖腐败旧发生了。此时,没人能轻易搞懂系统是如何设计的。

在好莱坞原则下,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用低层组件。换句话说,高层组件对待低层组件的方式是“别调用我们,我们会调用你”。p296图。

p296图

好莱坞原则是用在创建框架或组件上的一种技巧,好让低层组件能够被挂钩进计算中,而又不让会让高层组件依赖低层组件。

例子:p297图

p297图

blog comments powered by Disqus