標籤:java 設計模式 模板方法
情境
- 客戶到銀行辦理業務:
- 取號排隊
- 辦理具體現金/轉賬/企業/個人/理財業務
- 給銀行工作人員評分
核心:
處理某個流程的代碼已經都具備,但是其中某個節點的代碼暫時不能確定。因此,我們採用Factory 方法模式,,將這個節點的代碼實現轉移給子類完成。
即:處理步驟父類中定義好,具體實現延遲到子類中定義。
概述
模板方法模式是類的行為模式。準備一個抽象類別,將部分邏輯以具體方法以及具體建構函式的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。
比如定義一個操作中的演算法的骨架,將步驟延遲到子類中。模板方法使得子類能夠不去改變一個演算法的結構即可重定義演算法的某些特定步驟。
模式中的角色
抽象類別(AbstractClass):實現了模板方法,定義了演算法的骨架。
具體類(ConcreteClass):實現抽象類別中的抽象方法,已完成完整的演算法。
public abstract class Bank {public void takeNumber(){System.out.println("取號排隊");}/* 辦理具體的業務*/public abstract void transact();public void evaluate(){System.out.println("反饋評分");}public final void process(){this.takeNumber();this.transact();this.evaluate();}}public class Client {public static void main(String[] args) {// TODO Auto-generated method stubBank bank = new Bank(){@Overridepublic void transact() {// TODO Auto-generated method stubSystem.out.println("我要取錢");}};bank.process();}}
什麼時候用到模板方法模式:
實現一個演算法時,整體步驟很固定。但是,某些部分易變,易變部分可以抽象出來,供子類實現。
開發中常見的情境:
非常頻繁。各個架構、類庫中都有它的影子。比如常見的有:
- 資料庫訪問的封裝
- junit單元測試
- servlet中關於doGet/doPost方法調用
- hibernate中模板程式
- spring中JDBCTemplate、HibernateTemplate等
JAVA設計模式(17):行為型-模板方法模式(Template Method)