1. 什么是模板方法模式?
在一個(gè)方法中定義一個(gè)算法的骨架畜挥,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以在不改變算法結(jié)構(gòu)的情況下婴谱,重新定義算法中的某些步驟
模板方法模式定義了一套流程1蟹但、2、3谭羔,而其中的某個(gè)節(jié)點(diǎn)华糖,需要由不同的子類(lèi)去完成不同的實(shí)現(xiàn)。
2. 模板方法模式用來(lái)干什么?
模板方法封裝了一套算法執(zhí)行的流程瘟裸,將算法中變化的部分抽離出來(lái)由子類(lèi)實(shí)現(xiàn)客叉,實(shí)現(xiàn)代碼的復(fù)用。為了不讓子類(lèi)重寫(xiě)模板方法话告,一般將模板方法定義為final級(jí)別兼搏。
3. 怎么實(shí)現(xiàn)模板方法模式?
我們知道沙郭,泡茶和泡咖啡的流程大致上是一樣的佛呻,1. 燒開(kāi)水,2. 沖泡病线, 3.把茶或咖啡倒進(jìn)杯子吓著,其中只有沖泡的行為可能不同(選擇茶或者咖啡),我們就以這個(gè)為例送挑,擼一段代碼绑莺。
首先抽象出茶和咖啡的父類(lèi)飲料,定義出一套準(zhǔn)備飲料的流程惕耕,其中具體沖泡什么飲品由子類(lèi)決定:
package com.template;
public abstract class Beverage {
public void prepareBeverage() {
boilWater();
brew();
pourInCup();
}
public void boilWater() {
System.out.println("燒開(kāi)水");
}
public abstract void brew();
public void pourInCup() {
System.out.println("倒進(jìn)杯子");
}
}
然后是茶:
package com.template;
public class Tea extends Beverage {
@Override
public void brew() {
System.out.println("沖泡茶葉");
}
}
咖啡:
package com.template;
public class Coffee extends Beverage {
@Override
public void brew() {
System.out.println("沖泡咖啡");
}
}
測(cè)試:可以看到我們代碼其實(shí)跟策略模式或者工廠模式基本上一模一樣纺裁,那怎么去區(qū)分模板方法、策略和工廠呢赡突?
模板方法中对扶,子類(lèi)只實(shí)現(xiàn)了算法中的某一個(gè)步驟。而策略模式則是完成了整個(gè)的算法惭缰,工廠方法只用來(lái)生產(chǎn)實(shí)例浪南。