亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之模板方法模式

2020-01-26 15:15:38
字體:
來源:轉載
供稿:網友

前言

離開了自己工作了將近兩年的公司,日子不再有了忙碌,可以閑下來,躺在家里的床上,想著以后的路怎么走,說實話,真的很迷茫,從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;
}

總結

模板方法模式,總的來說很好接受,很好理解,沒有難點;對于此設計模式,我個人覺的還是可以和裝飾模式進行對比一下。還是有一些相似之處的。好了,該設計模式的講解就到此結束。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕在线| 欧美日韩国产精品一区二区不卡中文| 久久韩剧网电视剧| 亚洲色图第三页| 国产精品美女999| 国产精品久久久久久搜索| 亚洲欧美日韩爽爽影院| 538国产精品一区二区免费视频| 日本国产一区二区三区| 日韩av在线网址| 日本免费一区二区三区视频观看| 热久久视久久精品18亚洲精品| 亚洲欧美国产另类| 欧美精品第一页在线播放| 日韩av在线最新| 日本国产一区二区三区| 欧美日韩国产区| 亚洲成avwww人| 在线成人激情视频| 国产高清视频一区三区| 亚洲色图欧美制服丝袜另类第一页| 国产精品欧美亚洲777777| 国产69久久精品成人看| 精品偷拍各种wc美女嘘嘘| 国产一区二区三区免费视频| 精品美女国产在线| 欧美一区深夜视频| 91精品在线观看视频| 欧美激情在线狂野欧美精品| 精品国产区一区二区三区在线观看| 国产激情综合五月久久| 国产一区二区久久精品| 成人写真福利网| 中文字幕精品一区二区精品| 亚洲欧美国产高清va在线播| 国产精品爽黄69| 九色精品美女在线| 色综合久久天天综线观看| 北条麻妃一区二区在线观看| 国产xxx69麻豆国语对白| 亚洲无亚洲人成网站77777| 欧美日韩成人免费| 欧美在线一级va免费观看| 日韩电影中文字幕在线观看| 日韩欧美在线一区| 国产精品极品美女在线观看免费| 国产欧美日韩综合精品| 日韩电影在线观看永久视频免费网站| 欧美另类精品xxxx孕妇| 国产精品美女www爽爽爽视频| 日韩一区二区三区国产| 亚洲一区二区久久久久久| 亚洲aaaaaa| 欧美性猛交视频| 日韩一区在线视频| 亚洲欧洲日韩国产| 久久99精品国产99久久6尤物| 久久夜精品va视频免费观看| 久久精品国产一区| 亚洲人午夜色婷婷| 亚洲激情电影中文字幕| 欧美精品激情在线观看| 久久久极品av| 精品国产精品三级精品av网址| 久久91精品国产91久久跳| 亚洲美女喷白浆| 亚洲综合色av| 久久99亚洲热视| 亚洲第五色综合网| 欧美精品videofree1080p| 亚洲欧洲国产一区| 久久影院资源站| 国产精品一区二区电影| 久久人人爽人人| 亚洲精品欧美极品| 国产精品日韩在线播放| 91久久嫩草影院一区二区| 久久久精品一区二区三区| 97精品伊人久久久大香线蕉| 国产成人高潮免费观看精品| 色综合视频一区中文字幕| 精品国产乱码久久久久酒店| 青青精品视频播放| 欧美日韩中文在线观看| 国产日韩亚洲欧美| 久久精品一偷一偷国产| 亚洲午夜未满十八勿入免费观看全集| 亚洲男人天堂视频| 久久久久久亚洲精品| 欧美激情va永久在线播放| 海角国产乱辈乱精品视频| 国内揄拍国内精品少妇国语| 日韩av在线免费看| 中文字幕自拍vr一区二区三区| 欧美色视频日本高清在线观看| 国产一区二区三区毛片| xxx成人少妇69| 黄网站色欧美视频| 亚洲日韩第一页| 国产午夜精品全部视频在线播放| 亚洲第一综合天堂另类专| 91在线视频精品| 亚洲精品久久久久中文字幕欢迎你| 欧美一乱一性一交一视频| 欧美激情综合色| 久久精品国产96久久久香蕉| 91免费观看网站| 伦理中文字幕亚洲| 国产精品丝袜白浆摸在线| 久久人体大胆视频| 欧美成人午夜视频| 国产91精品久久久久久| 人九九综合九九宗合| 久久久中精品2020中文| 97超碰国产精品女人人人爽| 亚洲国产精品免费| 热99在线视频| 欧美综合国产精品久久丁香| 精品久久久久久久久久ntr影视| 国产精品成久久久久三级| 国产成人a亚洲精品| 亚洲国产精品国自产拍av秋霞| 国产色综合天天综合网| 97在线观看免费| 国产精品免费一区| 韩国国内大量揄拍精品视频| 国内精品一区二区三区四区| 97国产精品久久| 日本中文字幕久久看| 伊人久久久久久久久久久久久| 在线国产精品播放| 国产精品福利在线观看| 日韩欧美成人免费视频| 国产精品久久9| 欧美国产日韩免费| 国产精品免费视频xxxx| 国产suv精品一区二区| 国产日韩精品在线播放| 欧美性猛交xxx| 欧美特黄级在线| 国产91精品久久久久久久| 精品久久久久久久久久久久久| 色偷偷av亚洲男人的天堂| 国产精品久久久久7777婷婷| 久久精品视频播放| 青青草一区二区| 黑人巨大精品欧美一区免费视频| 日韩av毛片网| 俺去了亚洲欧美日韩| 爽爽爽爽爽爽爽成人免费观看| 欧美福利视频在线观看| 欧美做受高潮电影o| 国产一区二区黑人欧美xxxx| 欧美超级免费视 在线| 国产精品美女www爽爽爽视频| 国产97在线亚洲| 欧美俄罗斯性视频| 国模极品一区二区三区| 久久久久久久久久婷婷| 国产欧美日韩专区发布| 久久av资源网站| 久久久精品欧美| 91精品久久久久久久久中文字幕| 欧美在线观看视频|