Technology-设计模式-模板方法模式

本文介绍了GoF中的模板方法模式。

模式推演

当一个方法很多步骤都是固定的,但是某些步骤是可能变化的:

例如喝茶,步骤为煮水、泡茶、倒杯三个步骤,其中煮水和倒杯对于所有茶都是一样的,只有泡茶对于不同茶有差异,我们将泡茶这一步骤延迟到子类中实现:

1
2
3
4
5
6
7
8
public abstract class Tea{
public void drink{
boilWater();
brew();
pourInCup();
}
abstract void brew();
}

这种定义好一个算法的步骤,并允许子类为一个或者多个步骤提供实现的设计模式,称为模板方法模式。

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

遵行好莱坞原则的设计规则为:底层组件不要直接调用高层组件,只有在需要时,高层组件才调用底层组件,例如上面的Tea类。这样可以避免“依赖腐败”,即高层组件依赖底层组件,底层组件又反过来依赖高层组件。

好莱坞原则和依赖倒置原则的区别在于:依赖倒置让我们尽量避免使用具体类,而多使用抽象,而好莱坞原则则是让底层组件被挂钩在高层组件的计算中,但是又不会让高层组件依赖底层组件,即高层组件没有包含底层组件的对象。

定义

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

类图:

Technology-DesignPattern-TemplateMethod-Class

模板方法模式与策略模式的区别在于:模板方法是定义好一个算法骨架,通过继承的方法将一些步骤延迟到子类中实现,而策略模式是通过组合的方法,让用户可以随时替换封装好的算法。

模板方法模式与工厂方法模式的区别在于:工厂方法是针对于产品对象的实例化,而模板方法是针对于算法的某个步骤,而不是创建产品对象。

经典例子

Java中的Comparable,Sort方法的算法骨架会调用此方法,但此方法是在子类中实现的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Duck implements Comparable{
int weight;

public Duck(int weight){
this.weight = weight;
}

publint int compareTo(Object obj){
Duck otherDuck = (Duck)obj;
if(this.weight < otherDuck.weight)
return -1;
else if(this.weight == otherDuck.weight)
return 0;
else
return 1;
}
}

Duck[] ducks = {new Duck(2), new Duck(3), new Duck(1)};
Arrays.sort(ducks);