簡介
模板方法模式(Template Method Pattern)
定義一個操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
採用工廠方法的模式,將這個節點的代碼實現轉給子類完成。
處理步驟在父類中定義好了,具體的實現延遲到子類中給出定義。
代碼實現
假設有這樣一種情況
我們去醫院看病分爲以下三個步驟,前一個步驟,和後一個步驟固定
- 掛號
- 門診(不固定看哪個病)
- 買藥
代碼如下:
首先定義父類方法
/**
* 模板方法中的父類 tabeNumber buyMedicine 的步驟固定 diagnosis的步驟不固定
* @author guxiang
* @date 2017-2-25 下午2:16:38
*/
public abstract class SeeDoctor {
public void takeNumber() {
System.out.println("掛號");
}
/**
* 交給子類去實現
*/
public abstract void diagnosis();
public void buyMedicine() {
System.out.println("買藥");
}
public final void process() {
this.takeNumber();
this.diagnosis();
this.buyMedicine();
}
}
用一個客戶類測試
/**
* 客戶類測試
* @author guxiang
* @date 2017-2-25 下午2:20:35
*/
public class Client {
public static void main(String[] args) {
SeeDoctor sd1 = new SeeDoctor() {
@Override
public void diagnosis() {
System.out.println("診斷頸椎病");
}
};
sd1.process();
SeeDoctor sd2 = new SeeDoctor() {
@Override
public void diagnosis() {
System.out.println("診斷腰椎病");
}
};
sd2.process();
}
}
方法回調(鉤子方法)
模板方法模式充分的體現了“好萊塢”原則,
“不要給我們打電話,我們會給你打電話(don‘t call us, we‘ll call you)”。 IOC是Inversion of Control的簡稱,IOC的原理就是基於好萊塢原則,所有的組件都是被動的(Passive),所有的組件初始化和調用都由容器負責。(spring中有很好的體現)
子類不能調用父類,而是通過父類調用子類
常見的開發場景
- 數據庫訪問的封裝
- Junit 的單元測試
- Spring中的 JDBCTemplate,HibernateTemplate
- hibernate中的模板程序