模板方法模式(Template)

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


示例:


二、 现实中的模板方法模式
2.1 钩子(也就是通常说的回调callback)
钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行重写,要不要重写,子类可以自行决定,如果不重写,抽象类会提供一个默认的实现。钩子方法有一点点区别就是不需要声明为abstract的。

这里引入一个设计原则: 好莱坞原则
Do not call me, I will call you.

这个原则可以给我们一种防止“依赖腐 败”的方法。当高层组件依赖底层组件,而底层组件又依赖高层组件,高层组件又依赖其他组件,其他组件又依赖底层组件时,依赖腐 败就发生了。这种情况下,没有人可以轻易地搞懂系统是如何设计的。
好莱坞原则之下,我们允许底层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件。换句话说,高层组件对底层组件的方式是“别调用我们,我们会调用你”。

2.2 排序
JDK中Arrays.sort(Object[] a):
public static void sort(Object[] a) {
        Object[] aux = (Object[])a.clone();
        mergeSort(aux, a, 0, a.length, 0);
}


这里的mergeSort方法是实际的排序算法,这里又依赖于compareTo()方法,这个方法需要用户实现,也就是要排序的对象需要实现,通过实现Comparable接口来强制实现该方法(类似继承abstract类必须实现它的abstract方法)。

2.3 InputStream的read()方法
Java.io.InputStream类有一个read()方法,是需要子类来实现的,然后read()方法又被read(byte b[], int off, int len)模板方法来使用。

三、 模板方法模式和策略模式
策略模式是基于依赖接口和对象组合的思想实现的,而且策略模式中的算法类是实现整个算法,而模板方法模式不是组合,而是继承,而且只是实现算法的一部分,并不是整个。

参考资料
《HeadFirst设计模式》

猜你喜欢

转载自zoroeye.iteye.com/blog/2146437