有人爱喝茶,有人爱喝咖啡,因为两者都含有咖啡因。
咖啡的冲泡方法: 茶的冲泡法:
1:把水煮沸 1:把水煮沸
2:用沸水冲泡咖啡 2:用沸水浸泡茶叶
3:把咖啡倒进杯子 3:把茶倒进杯子
4:加糖和牛奶 4:加柠檬
观察上面的步骤发现第1步和第3步是一样的,可以将这两步抽象出来,放到上一层的抽象类中实现。
将第2步和第4步定义成抽象方法,由具体子类实现。最后在抽象类中定义一个方法,调用这4个方法。
package com.headfirst.chapter8; public abstract class CaffeineBeverage { public void prepareRecipe(){ boidWater();//烧水 brew();//冲泡 pourInCup();//倒进杯子 addCondiments();//加调料 } public void boidWater(){ System.out.println("Boiling water"); } public void pourInCup(){ System.out.println("pour in cup"); } abstract void brew(); abstract void addCondiments(); }
泡茶继承了上面那个抽象类,实现了加调料和冲泡方法
package com.headfirst.chapter8; public class Tea extends CaffeineBeverage{ void addCondiments() {//加柠檬 System.out.println("Add lemon"); } void brew() {//用沸水浸泡茶叶 System.out.println("Steep Tea Bag"); } }
咖啡也继承了上面那个抽象类,实现了加调料和冲泡方法
package com.headfirst.chapter8; public class Coffe extends CaffeineBeverage { void addCondiments() {//加入牛奶和糖 System.out.println("add sugar and milk"); } void brew() {//用沸水冲泡咖啡 System.out.println("Dripping Coffee through filter"); } }
模板方法定义:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
可以在模板方法中定义一个“钩子”
可以让子类有能力对算法的不同点进行挂钩,要不要挂钩,由子类决定。
例如可以在上面例子的抽象类中定义一个isCustomerWantsCondiments方法
默认返回true
子类可以覆盖这个方法,在超类的prepareRecipe方法中可以这样写
if(isCustomerWantsCondiments()){
addCondiments();//加调料
}
模板方法主要用于框架的实现。