C++設計模式編程中Template Method模板方法模式的運用
準備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。這就是模版方法模式的用意。
很多人可能沒有想到,模版方法模式實際上是所有模式中最為常見的幾個模式之一,而且很多人可能使用過模版方法模式而沒有意識到自己已經(jīng)使用了這個模式。模版方法模式是基于繼承的代碼復用的基本技術(shù),模版方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O計的核心。
模版方法模式需要開發(fā)抽象類和具體子類的設計師之間的協(xié)作。一個設計師負責給出一個算法的輪廓和骨架,另一些設計師則負責給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本法方法總匯起來的方法叫做模版方法(template method),這個設計模式的名字就是從此而來。
模版方法模式中的方法
模版方法中的方法可以分為兩大類:模版方法(Template Method)和基本方法(Primitive Method)。
模版方法
一個模版方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總算法或一個總行為的方法。這個模版方法一般會在抽象類中定義,并由子類不加以修改地完全繼承下來。
基本方法
基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。
- 抽象方法:一個抽象方法由抽象類聲明,由具體子類實現(xiàn)。在C#語言里一個抽象方法以abstract關(guān)鍵字標示出來。
- 具體方法:一個具體方法由抽象類聲明并實現(xiàn),而子類并不實現(xiàn)或置換。在C#語言里面,一個具體方法沒有abstract關(guān)鍵字。
- 鉤子方法:一個鉤子方法由抽象類聲明并實現(xiàn),而子類會加以擴展。通常抽象類給出的實現(xiàn)是一個空實現(xiàn),作為方法的默認實現(xiàn)。(Visual FoxPro中項目向?qū)Ы⒌捻椖繒褂靡粋€AppHook類實現(xiàn)監(jiān)視項目成員變化,調(diào)整系統(tǒng)結(jié)構(gòu)的工作。)鉤子方法的名字通常以do開始。
模板方法模式的實現(xiàn)
完整代碼示例(code):模板方法模式的實現(xiàn)很簡單,這里為了方便初學者的學習和參考,將給出完整的實現(xiàn)代碼(所有代碼采用 C++實現(xiàn),并在 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;
}
代碼說明:由于模板方法模式的實現(xiàn)代碼很簡單,因此解釋是多余的。其關(guān)鍵是將通用算法(邏輯)封裝起來,而將算法細節(jié)讓子類實現(xiàn)(多態(tài))。
唯一注意的是我們將原語操作(細節(jié)算法)定義未保護(Protected)成員,只供模板方法調(diào)用(子類可以)。
適用場景
一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn)。
各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。這是O p d y k e 和J o h n s o n 所描述過的“重分解以一般化”的一個很好的例子[ O J 9 3 ]。首先識別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調(diào)用這些新的操作的模板方法來替換這些不同的代碼。
控制子類擴展。模板方法只在特定點調(diào)用“h o o k ”操作(參見效果一節(jié)),這樣就只允許在這些點進行擴展。
欄 目:C語言
下一篇:C++實現(xiàn)俄羅斯方塊(windows API)
本文標題:C++設計模式編程中Template Method模板方法模式的運用
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/754.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什


