模板方法模式 The Template Method Pattern
模板方法模式“封装算法”
在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
- 模板就是一个方法,将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。
- 模板一般不是完整的,有部分实现在子类中
类图:
1、该抽象类中包含一个模板方法,模板方法在实现算法过程中,用到了下面两个原语操作(可以为具体的,也可以为抽象方法)
2、可能有多个具体类,每个都实现了模板方法所需要的全部操作。
3、当创建一个模板方法时,如果子类“必须”提供算法中某个方法的实现是,就使用抽象方法。
4、如果算法的这个部分是可选的,就用钩子。对于钩子,子类可以选择实现这个钩子。
钩子是一种被声明在抽象类中的方法,有一个默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。
例如:
public void templateMethod(){
stepOne();
stepTwo();
if ( doThisOrNot() ){ //钩子,子类重写这个方法以决定是否执行stepAnother();
stepAnother();
}
}
设计原则:
8、好莱坞原则:(高层组件对待底层组件的方式)
别调用(打电话给)我们,我们会调用(打电话给)你。
例如:
1、CaffeineBeverage是我们的高层组件,它能够控制冲泡法的算法,必要时调用子类实现的方法。
2、Tea和Coffee如果没有被调用,绝对不会直接调用抽象类。
模板方法、策略、工厂方法模式比较
模板方法:子类绝对如何实现算法中的步骤(用继承)
策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为(用组合)
工厂方法:有子类决定实例化哪个具体的类
(转载请注明出处 ^.^)