模板方法模式
看下面一个例子,星巴兹的冲咖啡和泡茶
星巴兹咖啡冲泡法 1 把水煮沸 2把沸水冲泡咖啡 3把咖啡倒进杯子 4 加糖和牛奶
星巴兹茶冲泡法 1 把水煮沸 2用沸水浸泡茶叶 3把茶叶倒进杯子 4 加柠檬
注意两份冲泡法都采用了相同的算法
1 把水煮沸 2用热水泡咖啡或茶 3把饮料倒入杯子 4在杯子中加入适当的调料;
所以我们可以使用模板设计模式
public abstract class CaffeineBeverage{
void final preparedRecipe(){
boilWater();
brew();
pourIncup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater(){
//具体实现 烧水
}
void popurIncup(){
//具体实现 热水倒入杯子
}
}
下面以茶为例:
public class Tea extends CaffeineBeverage{
public void brew{
//具体实现
}
public void addCondiments(){
//具体实现
}
//测试
public static void main(String args[]){
Tea tea = new Tea();
tea.preparedRecipe();
}
}
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
1.模板方法定义了算法的步骤,把这些步骤的实现延迟到子类中。
2.模板方法模式为我们提供了一种代码复用的重要技术。
3.模板方法模式的抽象类还可以定义具体的方法,抽象方法和钩子。
4.抽象方法可以由子类实现。
5.钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要覆盖它。
6.为防止子类改变模板方法中的算法,可以将模板方法声明为final
7.策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
8.工厂方法是模板方法的一种特殊版本。