- 定義:
定義一個操作中的算法的骨架冰沙,而將步驟延遲到子類中笙什。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義算法的某些特定步驟茵烈。 -
UML:
image.png -
模型:泡茶與泡咖啡绸吸。
泡茶的算法骨架:水燒開-沖泡茶葉-把茶水倒入杯子-加檸檬
泡咖啡的算法骨架:水燒開-沖泡咖啡粉-把咖啡倒入杯子-加糖和牛奶
我們抽象出制作熱飲的步驟:
image.png
public abstract class HotDrink {
//步驟是固定的婉烟,所以用final修飾娩井,不允許改變
public final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
//這一步是固定的,所以用final修飾似袁,不允許改變
public final void boilWater() {
System.out.println("燒水");
}
private final void pourInCup() {
System.out.println("倒進杯子中");
}
protected abstract void brew();
protected abstract void addCondiments();
}
//咖啡對象
public class Coffee extends HotDrink {
@Override
protected void brew() {
System.out.println("沖泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("添加糖和牛奶");
}
}
//茶對象
public class Tea extends HotDrink {
@Override
protected void brew() {
System.out.println("沖泡茶葉");
}
@Override
protected void addCondiments() {
System.out.println("添加檸檬");
}
}
使用方式:
public class MainTest {
public static void main(String[] agrs){
HotDrink coffee = new Coffee();
HotDrink tea = new Tea();
coffee.prepareRecipe();
tea.prepareRecipe();
}
}
運行結(jié)果:
image.png
通過抽象出模板模式洞辣,子類復(fù)用了超類中固定的部分,不同的子類中只需定義算法細節(jié)昙衅,就能實現(xiàn)不同的擴展扬霜,例如我們?nèi)绻爰右环N奶茶的熱飲,只需要繼承HotDrink,再實現(xiàn)沖泡奶茶而涉,加珍珠這兩步即可著瓶。