模板方法模式是編程中常常使用的模式。它定義了一種操做中的算法架構,將某些步驟延遲到子類中實現。這樣,新的子類能夠在不改變一個算法結構的前提下從新定義該算法的某些特定步驟。算法
(1)核心:數據庫
處理某個流程的代碼已經都定義好了,可是其中某個節點的代碼暫時不能肯定,所以,採用模板方法模式,將這個節點的代碼轉移到子類完成。編程
即:處理步驟在父類中定義好,具體實現延遲到子類中定義。架構
(2)何時採用模板方法模式?ide
實現一個算法,總體步驟很固定,可是,某些部分須要常常改變,因此把這部分抽象出來,供子類實現。單元測試
客戶到銀行辦理業務:測試
(1)取號排隊this
(2)辦理具體取款/存款/理財等業務lua
(3)反饋評分spa
第一步和第三步固定,第二步易變,因此採用模板方法模式實現。
1 /** 2 * 抽象的模板方法類 3 * @author CL 4 * 5 */ 6 public abstract class BankTemplateMethod { 7 /** 8 * 具體實現方法:排隊取號 9 */ 10 public void takeNumber() { 11 System.out.println("排隊取號"); 12 } 13 14 /** 15 * 抽象方法:辦理業務 16 * 鉤子方法 17 */ 18 public abstract void transact(); 19 20 /** 21 * 具體方法:反饋評分 22 */ 23 public void evaluate() { 24 System.out.println("反饋評分"); 25 } 26 27 /** 28 * 模板方法,將全部操做組合起來,通常子類不能重寫 29 */ 30 public final void process() { 31 this.takeNumber(); 32 33 this.transact(); //鉤子方法。執行時,掛在哪一個子類的方法上就執行哪一個方法 34 35 this.evaluate(); 36 } 37 }
1 /** 2 * 取款業務 3 * @author CL 4 * 5 */ 6 public class DrawMoney extends BankTemplateMethod { 7 8 @Override 9 public void transact() { 10 System.out.println("我要取款"); 11 } 12 13 }
測試:
1 /** 2 * 測試模板方法模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 //模板方法模式的三種實現方式 10 11 //第一種 12 BankTemplateMethod btm = new DrawMoney(); 13 btm.process(); 14 15 System.out.println("---------------------"); 16 //第二種 使用匿名內部類 17 BankTemplateMethod btm2 = new BankTemplateMethod() { 18 19 @Override 20 public void transact() { 21 System.out.println("我要存款"); 22 } 23 }; 24 25 btm2.process(); 26 27 System.out.println("---------------------"); 28 29 //第三種 30 new BankTemplateMethod() { 31 32 @Override 33 public void transact() { 34 System.out.println("我要理財"); 35 } 36 37 }.process(); 38 } 39 }
排隊取號 我要取款 反饋評分 --------------------- 排隊取號 我要存款 反饋評分 --------------------- 排隊取號 我要理財 反饋評分
(1)好萊塢原則 (Don't call me, we'll call you back)
(2)在軟件開發中,咱們能夠將call翻譯爲調用。子類不能調用父類,而經過父類調用子類。這些調用步驟已經在父類中寫好,徹底由父類控制整個過程。
(1)數據庫訪問的封裝;
(2)servlet 中關於 doGet / doPost 方法調用;
(3)Junit 單元測試;
(4)Hibernate 中模板程序;
(5)Spring 中 JDBCTemplate、HibernateTemplate 等;
(6)…………