Template Method 模板方法
阿新 • • 發佈:2018-12-30
Template Method是一種元件協作模式:通過晚繫結,來實現框架與應用程式之間的鬆耦合,是二者之間協作時常用的模式。
動機:在軟體構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因而無法和任務的整體結構同時實現。
如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求。
定義:定義一個操作中的演算法的骨架(穩定),而將一些步驟延遲(變化)到子類中。Template Method使得子類可以不改變(複用)一個演算法的結構即可重定義(override 重寫)該演算法的某些特定步驟。
類圖關係如下:
下面程式碼展示了Template Method;
//Template Method //程式庫開發人員 class Library{ public: //穩定template method void Run(){ step1(); if(step2()){//支援變化 ==> 虛擬函式的多型呼叫 step3(); } for(int i=0;i<4;++i){ step4();//支援變化 ==> 虛擬函式的多型呼叫 } step5(); virtual ~Library(); } protected: void step1(){ //... } void step3(){ //... } void step5(){ //... } virtual bool step2()=0;//變化 virtual bool step4()=0;//變化 } class Application: public Library{ protected: virtual bool step2(){ //...子類重寫實現 } virtual void step4(){ //...子類重寫實現 } } int main(){ Library* plib=new Application(); plib->Run(); delete plib; }
下面程式展示了沒有使用Template Method的情況
//結構化程式設計 class Library { public: void step1(){ //... } void step3(){ //... } void step5(){ //... } }; int main(){ Library lib(); Application app(); lib.step1(); if(app.step2()){ lib.step3(); } for(int i=0;i<4;++i){ app.step4(); } lib.step5(); }