GOF23設計模式之模板方法模式(template method)
阿新 • • 發佈:2018-01-23
評分 end 抽象方法 abs 方法調用 轉移 pri spa 應用
一、模板方法模式概述
模板方法模式是編程中經常使用的模式。它定義了一種操作中的算法架構,將某些步驟延遲到子類中實現。這樣,新的子類可以在不改變一個算法結構的前提下重新定義該算法的某些特定步驟。
(1)核心:
處理某個流程的代碼已經都定義好了,但是其中某個節點的代碼暫時不能確定,因此,采用模板方法模式,將這個節點的代碼轉移到子類完成。
即:處理步驟在父類中定義好,具體實現延遲到子類中定義。
(2)什麽時候采用模板方法模式?
實現一個算法,整體步驟很固定,但是,某些部分需要經常改變,所以把這部分抽象出來,供子類實現。
二、模板方法模式場景導入
客戶到銀行辦理業務:
(1)取號排隊
(2)辦理具體取款/存款/理財等業務
(3)反饋評分
第一步和第三步固定,第二步易變,所以采用模板方法模式實現。
三、模板方法模式示例代碼
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 publicfinal 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)…………
GOF23設計模式之模板方法模式(template method)