模板方法模式(Head first)
有人爱喝茶,有人爱喝咖啡,因为两者都含有咖啡因。
?
咖啡的冲泡方法: ? ? ? ? ? ?茶的冲泡法:
1:把水煮沸 ? ? ? ? ? ? ? ? ? ?1:把水煮沸
2:用沸水冲泡咖啡 ? ? ? ? ?2:用沸水浸泡茶叶
3:把咖啡倒进杯子 ? ? ? ? ?3:把茶倒进杯子
4:加糖和牛奶 ? ? ? ? ? ? ? ?4:加柠檬
?
?
观察上面的步骤发现第1步和第3步是一样的,可以将这两步抽象出来,放到上一层的抽象类中实现。
将第2步和第4步定义成抽象方法,由具体子类实现。最后在抽象类中定义一个方法,调用这4个方法。
?
?
可以在模板方法中定义一个“钩子”
可以让子类有能力对算法的不同点进行挂钩,要不要挂钩,由子类决定。
例如可以在上面例子的抽象类中定义一个isCustomerWantsCondiments方法
默认返回true
子类可以覆盖这个方法,在超类的prepareRecipe方法中可以这样写
if(isCustomerWantsCondiments()){
??addCondiments();//加调料
}
?
模板方法主要用于框架的实现。