本文介绍了GoF中的模板方法模式。
模式推演
当一个方法很多步骤都是固定的,但是某些步骤是可能变化的:
例如喝茶,步骤为煮水、泡茶、倒杯三个步骤,其中煮水和倒杯对于所有茶都是一样的,只有泡茶对于不同茶有差异,我们将泡茶这一步骤延迟到子类中实现:
1 | public abstract class Tea{ |
这种定义好一个算法的步骤,并允许子类为一个或者多个步骤提供实现的设计模式,称为模板方法模式。
OO原则(好莱坞):别调用(打电话给)我们,我们会调用(打电话给)你。
遵行好莱坞原则的设计规则为:底层组件不要直接调用高层组件,只有在需要时,高层组件才调用底层组件,例如上面的Tea类。这样可以避免“依赖腐败”,即高层组件依赖底层组件,底层组件又反过来依赖高层组件。
好莱坞原则和依赖倒置原则的区别在于:依赖倒置让我们尽量避免使用具体类,而多使用抽象,而好莱坞原则则是让底层组件被挂钩在高层组件的计算中,但是又不会让高层组件依赖底层组件,即高层组件没有包含底层组件的对象。
定义
模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
类图:
模板方法模式与策略模式的区别在于:模板方法是定义好一个算法骨架,通过继承的方法将一些步骤延迟到子类中实现,而策略模式是通过组合的方法,让用户可以随时替换封装好的算法。
模板方法模式与工厂方法模式的区别在于:工厂方法是针对于产品对象的实例化,而模板方法是针对于算法的某个步骤,而不是创建产品对象。
经典例子
Java中的Comparable,Sort方法的算法骨架会调用此方法,但此方法是在子类中实现的。
1 | public class Duck implements Comparable{ |