模板方法模式: 定義乙個操作中的演算法的骨架, 而將一些步驟延遲到子類中. 模板方法使得子類可以在不改變乙個演算法的結構的前提下重定義該演算法的某些特定步驟。
(**: 設計模式:可復用物件導向軟體的基礎)
tips
處理某個流程的骨架**已經具備, 但其中某節點的具體實現暫不確定, 此時可採用模板方法, 將該節點的**實現轉移給子類完成. 即:處理步驟在父類中定義好, 具體實現延遲到子類中定義.
到atm取款機辦理業務, 都會經過插卡、輸密碼、處理業務、取卡 等幾個過程, 而且這幾個過程一定是順序執行的, 且除了 處理業務 (如取款、改密、查賬) 可能會有所不同之外, 其他的過程完全相同. 因此我們就可以參考模板方法模式把插卡、輸密碼、取卡 3個過程放到父類中實現, 並定義乙個流程骨架, 然後將 處理業務的具體邏輯 放到子類中:
abstractclass 抽象模板:
定義抽象的原語操作,具體的子類將重定義它們以實現乙個演算法的各步驟. 實現乙個模板方法,定義乙個演算法的骨架. 該模板方法不僅呼叫原語操作,也呼叫定義在abstractclass或其他物件中的操作.
/*** @author jifang
* @since 16/8/21 上午10:35.
*/public abstract class abstractatmbusiness
system.out.println("-> 取卡");
}// 具體業務處理延遲到子類實現
protected abstract void onbusiness();
private boolean checkpassword()
}abstractatmbusiness是乙個模板方法, 它定義了atm操作的乙個主要步驟並確定他們的先後順序, 但允許子類改變這些具體步驟以滿足各自的需求.
concreteclass
實現原語操作以完成演算法中與特定子類相關的步驟; 每個abstractclass都可有任意多個concreteclass, 而每個concreteclass都可以給出這些抽象方法的不同實現, 從而使得頂級邏輯的功能各不相同:
class checkoutconcreteatmbusiness extends abstractatmbusiness
}class changepasswordconcreteatmbusiness extends abstractatmbusiness
}client/**
* created by jifang on 15/12/3.
*/public class client
}httpservlet定義了service()方法固定下來http請求的整體處理流程,使得開發servlet只需繼承httpservlet並實現doget()/dopost()等方法完成業務邏輯處理, 並不需要關心具體的http響應流程:
/*** httpservlet中的service方法
}詳見: servlet - 基礎.
將這個示例放在此處可能有些不大合適, 但它也體現了一些模板方法的思想:
1. 實現
scheduletaskmonitor
/*** @author jifang
* @since 16/8/23 下午3:35.
*/public class scheduletaskmonitor implements initializingbean, disposablebean
}}, 0, _10s);
}public void register(scheduletask task)
@override
public void afterpropertiesset() throws exception ", this.getclass());
}@override
public void destroy() throws exception ", this.getclass());}}
scheduletaskpublic inte***ce scheduletask
2. 使用
只需在spring的配置檔案中引入該bean:
需要統一定時的類實現scheduletask介面, 並將自己註冊到monitor中:
/*** @author jifang
* @since 16/3/16 上午9:59.
*/@controller
public class logincontroller implements scheduletask, initializingbean
@override
public void afterpropertiesset() throws exception
}即可完成scheduletask()方法的定時排程.
模板方法模式提供了乙個很好的**復用平台, 他通過把不變行為搬移到父類,去除子類中重複**來體現它的優勢: 有時我們會遇到由一系列步驟構成的過程需要執行, 該過程從高層次上看是相同的, 但有某些細節的實現可能不同, 此時就可以考慮使用用模板方法了.
適用一次性實現演算法的不變部分, 並將可變的行為留給子類來實現; 各子類中公共的行為應該被提取出來並集中到乙個公共父類中避免**重複, 如:servlet的 service()方法. 控制子類擴充套件, 模板方法只在特定點呼叫hook操作, 這樣就只允許在這些點進行擴充套件, 如: junit測試框架.
相關模式
factory method常被模板方法呼叫. strategy: 模板方法使用繼承來改變演算法的一部分, strategy使用委託來改變整個演算法.
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...