C++設計形式之模板辦法形式。本站提示廣大學習愛好者:(C++設計形式之模板辦法形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之模板辦法形式正文
媒介
分開了本身任務了快要兩年的公司,日子不再有了勞碌,可以閒上去,躺在家裡的床上,想著今後的路怎樣走,說真話,真的很渺茫,從2012年卒業到如今,時光不長,然則學到的器械真的長短常無限,一向從事於Windows平台上的開辟。說到Windows平台的開辟,年夜家都確定曉得的HOOK的,即便不曉得HOOK,關於COM應當也是曉得的,我的系列博文中也對COM停止過周全的總結。說白了,HOOK就是在履行某個功效時,會有一個一系列的履行進程,關於這個進程普通都是固定的,好比:第一步履行甚麼,第二步干甚麼,最初一步干甚麼,都是設計好的。而詳細若何去完成每步,都是可以由法式員去掌握的。COM也是如斯,COM是面臨接口的,當完成某一個功效模塊時,便可能是系列接口的疊加挪用,而接口的完成都是由法式員來掌握的。說白了,一個功效模塊的完成流程是固定了,然則關於每步的詳細完成都是不固定的。關於這類需求,普通是若何來做的呢?從設計形式的角度來講,這個設計形式叫模板辦法形式,能夠你不曉得這個設計形式的名字,然則,這類辦法你曾經用過了。如今我就對模板辦法形式停止具體的總結。
模板辦法形式
在GOF的《設計形式:可復用面向對象軟件的基本》一書中對模板辦法形式是如許說的:界說一個操作中的算法骨架,而將一些步調延遲到子類中。TemplateMethod使得子類可以不轉變一個算法的接口便可重界說改算法的某些特定步調。
我聯合我在現實開辟項目中的一個例子來講說這個模板辦法形式吧。我們已經做過一款產物,這個產物相似於一個雲真個文件治理客戶端。關於如許的一個客戶端,因為其雲真個辦事器有三種,而每種辦事器之間的通訊方法和對外地下的接口都是否是分歧的,這就須要完成的客戶端要屏障雲端辦事器和接口的差別性,而供給同一的操作界面,所以在完成這個客戶真個同時,我們完成了一個框架,一個關於辦事器和接口是通用的框架,好比就拿文件下載來講說。我們的完成年夜概以下:
class FileOperation
{
public:
bool DownloadFile(wchar_t *pSrc, wchar_t *pDest)
{
if (!pSrc || !pDest) return false;
if (!DoBeginDownloadFile(pSrc, pDest)) return false;
if (!DoDownloadFile(pSrc, pDest)) return false;
if (!DoEndDownloadFile(pSrc, pDest)) return false;
}
protected:
virtual bool DoBeginDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoEndDownloadFile(wchar_t *pSrc, wchar_t *pDest);
};
class HttpFileOperation : public FileOperation
{
protected:
virtual bool DoBeginDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoEndDownloadFile(wchar_t *pSrc, wchar_t *pDest);
};
class SOAPFileOperation : public FileOperation
{
protected:
virtual bool DoBeginDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoDownloadFile(wchar_t *pSrc, wchar_t *pDest);
virtual bool DoEndDownloadFile(wchar_t *pSrc, wchar_t *pDest);
};
下載文件的流程為:先挪用DoBeginDownloadFile,履行下載文件之前的一些操作,再挪用DoDownloadFile完成真實的文件下載,最初挪用DoEndDownloadFile完成文件下載的清算任務。關於任何辦事器,下載文件的這個流程是不會產生變更的。而在DoBeginDownloadFile、DoDownloadFile和DoEndDownloadFile的外部詳細是若何完成的,由法式員依據詳細的雲端辦事器和對外地下的接口來完成的。終究客戶端去完成文件下載操作時,只會挪用DownloadFile函數便可以完成。可以看到,在下面的代碼中,只要DownloadFile是public的,其它的操作函數都是protected。這也意味著,我們完成的框架對外只地下DownloadFile接口。
UML類圖
AbstractClass(籠統類):界說籠統的原語操作,詳細的子類將重界說它們以完成一個算法的各步調。重要是完成一個模板辦法,界說一個算法的骨架。該模板辦法不只挪用原語操作,也挪用界說在AbstractClass或其他對象中的操作。
ConcreteClass(詳細類):完成原語操作以完成算法中與特定子類相干的步調。
因為在詳細的子類ConcreteClass中重界說了完成一個算法的各步調,而關於不變的算法流程則在AbstractClass的TemplateMethod中完成。
應用場所
模板辦法是一種代碼復用的根本技巧。它們在類庫中尤其主要,它們提取了類庫中的公共行動。在應用模板辦法時,很主要的一點是模板辦法應當指明哪些操作是可以被重界說的,和哪些是必需被重界說的。要有用的重用一個籠統類,子類編寫者必需明白懂得哪些操作是設計為有待重界說的。
代碼完成
這裡就依據下面的類圖,對模板辦法形式停止了簡略的完成。因為該形式異常簡略,所以也沒有更多的可以講的了。
#include <iostream>
using namespace std;
class AbstractClass
{
public:
void TemplateMethod()
{
PrimitiveOperation1();
cout<<"TemplateMethod"<<endl;
PrimitiveOperation2();
}
protected:
virtual void PrimitiveOperation1()
{
cout<<"Default Operation1"<<endl;
}
virtual void PrimitiveOperation2()
{
cout<<"Default Operation2"<<endl;
}
};
class ConcreteClassA : public AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
cout<<"ConcreteA Operation1"<<endl;
}
virtual void PrimitiveOperation2()
{
cout<<"ConcreteA Operation2"<<endl;
}
};
class ConcreteClassB : public AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
cout<<"ConcreteB Operation1"<<endl;
}
virtual void PrimitiveOperation2()
{
cout<<"ConcreteB Operation2"<<endl;
}
};
int main()
{
AbstractClass *pAbstractA = new ConcreteClassA;
pAbstractA->TemplateMethod();
AbstractClass *pAbstractB = new ConcreteClassB;
pAbstractB->TemplateMethod();
if (pAbstractA) delete pAbstractA;
if (pAbstractB) delete pAbstractB;
}
總結
模板辦法形式,總的來講很好接收,很好懂得,沒有難點;關於此設計形式,我小我覺的照樣可以和裝潢形式停止比較一下。照樣有一些類似的地方的。好了,該設計形式的講授就到此停止。