這是bwar在2023年寫的設計模式c++實現,**均可編譯可執行,一直存在自己的電腦裡,曾經在團隊技術分享中分享過,現搬到線上來。
1.1 目的
定義乙個操作中的演算法骨架,而將一些步驟延遲到子類中。templatemethod使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
1.2 適用性
(1) 一次性實現乙個演算法的不變部分,並將可變的信鴿網i留給子類來實現。
(2) 各子類中公共的行為應被提取出來並幾種到乙個公共父類中以避免**重複。
(3) 控制子類的擴充套件。
用模板方法實現遊戲的資料統計框架。遊戲往往有很多服,稱之為大區,mmo遊戲中也稱之為world。遊戲的資料統計會有很多資料指標,所有資料指標都既需要全域性的統計,又需要各大區的分開統計,這些資料指標的統計邏輯統計方法又是完全一樣的。我們用模板方法定義乙個適用於所有指標(活躍、流失、留存、付費等)的統計框架,具體統計邏輯留給子類實現。這樣的乙個遊戲框架在2023年到2023年在行業第一的遊戲公司用在一百多款各型別遊戲資料統計上,當然,模板方法只是這個遊戲資料統計框架最基礎的一部分,乙個通用的遊戲資料統計框架並沒有那麼簡單。
run()為模板方法,run()方法內固定依次呼叫clusterinit()、stat()、clusterstat()。clusterinit()完成統計初始化,stat()完成各大區的分割槽統計,clusterstat()完成所有大區結果去重統計。整個統計框架實現多執行緒排程,但具體實現統計邏輯的子類並無須關注執行緒排程,甚至完全不懂執行緒的開發人員也能使用該統計框架開發出多執行緒統計程式。run()模板方法確保了clusterinit()只會在第乙個進入統計邏輯的執行緒執行且只執行一次(此時,其他執行緒處於等待clusterinit()完成的阻塞狀態);stat()方法在每個執行緒中同時開始執行;clusterstat()只在最後乙個完成stat()的執行緒執行且只執行一次。統計邏輯開發者只需專注於這三個方法的具體實現,其他都交給框架完成,而框架則是通過者三個方法將骨架定義好,確保所有統計都按固定流程走。
**實現:
abstractclass.h:
#ifndef abstractclass_h_abstractclass.cpp:#define abstractclass_h_#include
using
namespace
std;
class
cabstractclass
virtual
intclusterstat()
intgetworldid()
};#endif /* abstractclass_h_ */
#include "concreteclass.h:abstractclass.h
"cabstractclass::cabstractclass()
cabstractclass::~cabstractclass()
intcabstractclass::run()
#ifndef concreteclass_h_concreteclass.cpp:#define concreteclass_h_#include
"abstractclass.h
"class cconcreteclass : public
cabstractclass
*/protected
:
virtual
intstat();
virtual
intclusterinit()
virtual
intclusterstat()
};#endif /* concreteclass_h_ */
#include "templatemethodmain.cpp:concreteclass.h
"cconcreteclass::cconcreteclass()
cconcreteclass::~cconcreteclass()
intcconcreteclass::stat()
#include #include模板方法在高效能的c++非同步通訊框架nebula"abstractclass.h
"#include
"concreteclass.h
"using
namespace
std;
intmain()
中也有廣泛應用,nebula框架的actor中的cmd、step、session都使用了模板方法。
出處:bwar傾力打造的高效能網路框架nebula:
設計模式 模板方法模式C 實現
定義乙個操作的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。實現方案 將演算法 邏輯框架放在抽象基類中,並定義好實現介面,在子類中實現細節介面。注 策略模式,解決的是相同的問題,只是其方案是將各個介面封裝為類,通過委託 組合方式解決問題 ...
C 實現 設計模式 4 模板方法模式
參考書籍 公司接到乙個xx模型公司的的訂單 需要生產10萬悍馬的車模 只做基本的實現 不靠慮擴充套件性 那麼就開始埋頭幹 先按照最一般的經驗設計類圖 如圖所示 非常簡單的實現 悍馬車有兩個型號 h1和h2 按照需求 只需要悍馬模型 那就給你悍馬模型 先寫乙個抽象類 然後兩個不同型號的模型實現類 通過...
設計模式之模板方法模式 C 實現
更多設計模式參看 設計模式之模式概述 模式彙總 c 實現 模式結構 示例 模板方法模式 template method pattern 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。解決復用和擴充套件兩個問題 模...