C++設計形式編程中Template Method模板辦法形式的應用。本站提示廣大學習愛好者:(C++設計形式編程中Template Method模板辦法形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式編程中Template Method模板辦法形式的應用正文
預備一個籠統類,將部門邏輯以詳細辦法和詳細結構子的情勢完成,然後聲明一些籠統辦法來迫使子類完成殘剩的邏輯。分歧的子類可以以分歧的方法完成這些籠統辦法,從而對殘剩的邏輯有分歧的完成。這就是模版辦法形式的意圖。
許多人能夠沒有想到,模版辦法形式現實上是一切形式中最為罕見的幾個形式之一,並且許多人能夠應用過模版辦法形式而沒無意識到本身曾經應用了這個形式。模版辦法形式是基於繼續的代碼復用的根本技巧,模版辦法形式的構造和用法也是面向對象設計的焦點。
模版辦法形式須要開辟籠統類和詳細子類的設計師之間的協作。一個設計師擔任給出一個算法的輪廓和骨架,另外一些設計師則擔任給出這個算法的各個邏輯步調。代表這些詳細邏輯步調的辦法稱做根本辦法(primitive method);而將這些根本法辦法總匯起來的辦法叫做模版辦法(template method),這個設計形式的名字就是從此而來。
模版辦法形式中的辦法
模版辦法中的辦法可以分為兩年夜類:模版辦法(Template Method)和根本辦法(Primitive Method)。
模版辦法
一個模版辦法是界說在籠統類中的,把根本操作辦法組合在一路構成一個總算法或一個總行動的辦法。這個模版辦法普通會在籠統類中界說,並由子類不加以修正地完整繼續上去。
根本辦法
根本辦法又可以分為三種:籠統辦法(Abstract Method)、詳細辦法(Concrete Method)和鉤子辦法(Hook Method)。
模板辦法形式的完成
完全代碼示例(code):模板辦法形式的完成很簡略,這裡為了便利初學者的進修和參考,將給出完全的完成代碼(一切代碼采取 C++完成,並在 VC 6.0 下測試運轉)。
代碼片段 1:Template.h
//Template.h #ifndef _TEMPLATE_H_ #define _TEMPLATE_H_ class AbstractClass{ public: virtual ~AbstractClass(); void TemplateMethod(); protected: virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; AbstractClass(); private: }; class ConcreteClass1:public AbstractClass{ public: ConcreteClass1(); ~ConcreteClass1(); protected: void PrimitiveOperation1(); void PrimitiveOperation2(); private: }; class ConcreteClass2:public AbstractClass{ public: ConcreteClass2(); ~ConcreteClass2(); protected: void PrimitiveOperation1(); void PrimitiveOperation2(); private: }; #endif //~_TEMPLATE_H_
代碼片段 2:Template.cpp
#include "Template.h" #include <iostream> using namespace std; AbstractClass::AbstractClass(){ } AbstractClass::~AbstractClass(){ } void AbstractClass::TemplateMethod(){ this->PrimitiveOperation1(); this->PrimitiveOperation2(); } ConcreteClass1::ConcreteClass1(){ } ConcreteClass1::~ConcreteClass1(){ } void ConcreteClass1::PrimitiveOperation1(){ cout<<"ConcreteClass1...PrimitiveOperat ion1"<<endl; } void ConcreteClass1::PrimitiveOperation2(){ cout<<"ConcreteClass1...PrimitiveOperat ion2"<<endl; } ConcreteClass2::ConcreteClass2(){ } ConcreteClass2::~ConcreteClass2(){ } void ConcreteClass2::PrimitiveOperation1(){ cout<<"ConcreteClass2...PrimitiveOperat ion1"<<endl; } void ConcreteClass2::PrimitiveOperation2(){ cout<<"ConcreteClass2...PrimitiveOperat ion2"<<endl; }
代碼片段 3:main.cpp
#include "Template.h" #include <iostream> using namespace std; int main(int argc,char* argv[]){ AbstractClass* p1 = new ConcreteClass1(); AbstractClass* p2 = new ConcreteClass2(); p1->TemplateMethod(); p2->TemplateMethod(); return 0; }
代碼解釋:因為模板辦法形式的完成代碼很簡略,是以說明是過剩的。其症結是將通用算法(邏輯)封裝起來,而將算法細節讓子類完成(多態)。
獨一留意的是我們將原語操作(細節算法)界說未掩護(Protected)成員,只供模板辦法挪用(子類可以)。
實用場景
一次性完成一個算法的不變的部門,並將可變的行動留給子類來完成。
各子類中公共的行動應被提掏出來並集中到一個公共父類中以免代碼反復。這是O p d y k e 和J o h n s o n 所描寫過的“重分化以普通化”的一個很好的例子[ O J 9 3 ]。起首辨認現有代碼中的分歧的地方,而且將分歧的地方分別為新的操作。最初,用一個挪用這些新的操作的模板辦法來調換這些分歧的代碼。
掌握子類擴大。模板辦法只在特定點挪用“h o o k ”操作(拜見後果一節),如許就只許可在這些點停止擴大。