模板方法
1.定义
在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2.类图
3.例子
咖啡因饮料
茶和咖啡都是咖啡因饮料,它们的冲泡方法也很相似:
星巴兹咖啡冲泡法 星巴兹茶冲泡法
⑴ 把水煮沸 ⑴ 把水煮沸
⑵ 用沸水冲泡咖啡 ⑵ 用沸水浸泡茶叶
⑶ 把咖啡倒进杯子 ⑶ 把茶倒进杯子
⑷ 加糖和牛奶 ⑷ 加柠檬
a.不使用模板方法时
Coffee类
public class Coffee extends CaffeineBeverage{ void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } public void brewCoffeeGrinds() { System.out.println("Dripping Coffee through filter"); } public void addSugarAndMilk() { System.out.println("Adding Sugar and Milk"); }}
Tea类
public class Tea { void prepareRecipe() extends CaffeineBeverage{ boilWater(); steepTeaBag(); pourInCup(); addLemon(); } public void steepTeaBag() { System.out.println("Steeping the tea"); } public void addLemon() { System.out.println("Adding Lemon"); } }
CaffeineBeverage类
public class CaffeineBeverage{ abstract void prepareRecipe(); void boilWater() { System.out.println("Boiling water...."); } void pourInCup() { System.out.println("Pouring into the cup"); } }
b.使用模板方法时
CaffeineBeverage(咖啡因饮料)超类:
public abstract class CaffeineBeverage { // 抽象类 final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); void boilWater() { System.out.println("Boiling water"); } void pourInCup() { System.out.println("Pouring into cup"); }
咖啡和茶都依赖于超类(咖啡因饮料)处理冲泡法
public class Coffee extends CaffeineBeverage { public void brew() { System.out.println("Dripping Coffee through filter"); } public void addCondiments() { System.out.println("Adding Sugar and Milk"); } }
public class Tea extends CaffeineBeverage { public void brew() { System.out.println("Steeping the tea"); } public void addCondiments() { System.out.println("Adding Lemon"); } }