定義乙個操作的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
實現方案:將演算法/邏輯框架放在抽象基類中,並定義好實現介面,在子類中實現細節介面。
注:策略模式,解決的是相同的問題,只是其方案是將各個介面封裝為類,通過委託/組合方式解決問題
cout << "開車門"
cout << "關車門"
cout << "發車走人"
abstractclass *car = new concreteclass();
car->run();
基本方法,由子類實現的方法,並且在模板方法中被呼叫。
模板方法,是乙個或者幾個,一般是乙個具體方法/框架,實現對基本方法的排程,完成固定的邏輯。
①優點封裝不變部分/邏輯框架,擴充套件可變部分/具體細節
提取公共部分**,便於維護
行為由父類控制,子類實現-->基本方法子類實現,因此子類可以通過擴充套件的方式增加相應的功能,符合開閉原則
②缺點因為模板方法將依賴點到,抽象中的框架實現依賴具體類的細節實現。所以是子類行為影響了父類。在複雜專案中,會造成**閱讀困難。
多個子類有共有的方法,並且邏輯相同/邏輯相同,細節有差異
對重要,複雜的演算法,可以講核心演算法設計為模板方法,周邊細節由子類實現
重構時,經常使用的方案,將相同的**抽象到父類,通過鉤子函式約束行為。
①對於原定框架中的模板方法,如果存在子類中對某個介面的具有選擇性(執行或者不執行),那麼在呼叫時就需要具體判別這種差異性呼叫。
②對這種選擇性,用過鉤子,策略模式等方案。判別,呼叫。然後在子類中實現具體的鉤子定義。
父類呼叫子類的方法:
①把子類傳遞到父類的有殘建構函式,然後呼叫
②使用反射的方式呼叫
③父類呼叫子類的靜態方法
雖然這幾種方式也實現了父類呼叫子類方法,但是在專案中並不能運用。子類簡歷框架,子類在重寫了父類部分方法後,再呼叫從父類整合的方法,產生不同的結果。這正是模板方法--曲線救國。
在開元框架中,模板方法提供了乙個抽象類,然後開元框架寫一堆子類。如果需要擴充套件功能,可以繼承這個抽象類,然後覆寫protected方法,然後呼叫乙個execute(run)方法,就完成功能擴充套件。
C 實現 設計模式 4 模板方法模式
參考書籍 公司接到乙個xx模型公司的的訂單 需要生產10萬悍馬的車模 只做基本的實現 不靠慮擴充套件性 那麼就開始埋頭幹 先按照最一般的經驗設計類圖 如圖所示 非常簡單的實現 悍馬車有兩個型號 h1和h2 按照需求 只需要悍馬模型 那就給你悍馬模型 先寫乙個抽象類 然後兩個不同型號的模型實現類 通過...
設計模式之模板方法模式 C 實現
更多設計模式參看 設計模式之模式概述 模式彙總 c 實現 模式結構 示例 模板方法模式 template method pattern 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。解決復用和擴充套件兩個問題 模...
設計模式C 實現 一 模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重寫定義演算法中的某些步驟。假如我們有兩種咖啡因飲料 茶和咖啡。茶的製作過程為 1 燒水 2 用沸水浸泡茶葉 3 把茶倒進杯子 4 加檸檬 而咖啡的製作過程為 1 燒水 2 用沸...