模板方法模式C++實現
1定義
定義一個操作的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
實現方案:將算法/邏輯框架放在抽象基類中,並定義好實現接口,在子類中實現細節接口。
注:策略模式,解決的是相同的問題,只是其方案是將各個接口封裝為類,通過委托/組合方式解決問題
2類圖
3實現
class AbstractClass
{
public:
void Run()
{
DoA();
DoB();
DoC();
}
virtual void DoA()=0;
virtual void DoB()=0;
virtual void DoC()=0;
};
class ConcreteClass:public AbstractClass
{
public:
void DoA()
{
cout << "開車門"<<endl;
}
void DoB()
{
cout << "關車門"<<endl;
}
void DoC()
{
cout << "發車走人"<<endl;
}
};
void Test()
{
AbstractClass *car = new ConcreteClass();
car->Run();
}
3成員
基本方法,由子類實現的方法,並且在模板方法中被調用。
模板方法,是一個或者幾個,一般是一個具體方法/框架,實現對基本方法的調度,完成固定的邏輯。
4應用
①優點
封裝不變部分/邏輯框架,擴展可變部分/具體細節
提取公共部分代碼,便於維護
行為由父類控制,子類實現-->基本方法子類實現,因此子類可以通過擴展的方式增加相應的功能,符合開閉原則
②缺點
因為模板方法將依賴點到,抽象中的框架實現依賴具體類的細節實現。所以是子類行為影響了父類。在復雜項目中,會造成代碼閱讀困難。
5 使用場景
多個子類有共有的方法,並且邏輯相同/邏輯相同,細節有差異
對重要,復雜的算法,可以講核心算法設計為模板方法,周邊細節由子類實現
重構時,經常使用的方案,將相同的代碼抽象到父類,通過鈎子函數約束行為。
6擴展
①對於原定框架中的模板方法,如果存在子類中對某個接口的具有選擇性(執行或者不執行),那么在調用時就需要具體判別這種差異性調用。
②對這種選擇性,用過鈎子,策略模式等方案。判別,調用。然后在子類中實現具體的鈎子定義。
7狡辯
父類調用子類的方法:
①把子類傳遞到父類的有殘構造函數,然后調用
②使用反射的方式調用
③父類調用子類的靜態方法
雖然這幾種方式也實現了父類調用子類方法,但是在項目中並不能運用。子類簡歷框架,子類在重寫了父類部分方法后,再調用從父類集成的方法,產生不同的結果。這正是模板方法--曲線救國。
8應用
在開元框架中,模板方法提供了一個抽象類,然后開元框架寫一堆子類。如果需要擴展功能,可以繼承這個抽象類,然后覆寫protected方法,然后調用一個execute(run)方法,就完成功能擴展。