最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計(jì)模式編程中Template Method模板方法模式的運(yùn)用

 更新時(shí)間:2016年03月09日 14:34:37   作者:夢(mèng)在天涯  
這篇文章主要介紹了C++設(shè)計(jì)模式編程中Template Method模板方法模式的運(yùn)用,講到了包括模板方法模式中的細(xì)分方法以及適用場(chǎng)景,需要的朋友可以參考下

準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。這就是模版方法模式的用意。

很多人可能沒(méi)有想到,模版方法模式實(shí)際上是所有模式中最為常見(jiàn)的幾個(gè)模式之一,而且很多人可能使用過(guò)模版方法模式而沒(méi)有意識(shí)到自己已經(jīng)使用了這個(gè)模式。模版方法模式是基于繼承的代碼復(fù)用的基本技術(shù),模版方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心。

模版方法模式需要開(kāi)發(fā)抽象類和具體子類的設(shè)計(jì)師之間的協(xié)作。一個(gè)設(shè)計(jì)師負(fù)責(zé)給出一個(gè)算法的輪廓和骨架,另一些設(shè)計(jì)師則負(fù)責(zé)給出這個(gè)算法的各個(gè)邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本法方法總匯起來(lái)的方法叫做模版方法(template method),這個(gè)設(shè)計(jì)模式的名字就是從此而來(lái)。

模版方法模式中的方法

模版方法中的方法可以分為兩大類:模版方法(Template Method)和基本方法(Primitive Method)。

模版方法

一個(gè)模版方法是定義在抽象類中的,把基本操作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。這個(gè)模版方法一般會(huì)在抽象類中定義,并由子類不加以修改地完全繼承下來(lái)。

基本方法

基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

  • 抽象方法:一個(gè)抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在C#語(yǔ)言里一個(gè)抽象方法以abstract關(guān)鍵字標(biāo)示出來(lái)。
  • 具體方法:一個(gè)具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。在C#語(yǔ)言里面,一個(gè)具體方法沒(méi)有abstract關(guān)鍵字。
  • 鉤子方法:一個(gè)鉤子方法由抽象類聲明并實(shí)現(xiàn),而子類會(huì)加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個(gè)空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。(Visual FoxPro中項(xiàng)目向?qū)Ы⒌捻?xiàng)目會(huì)使用一個(gè)AppHook類實(shí)現(xiàn)監(jiān)視項(xiàng)目成員變化,調(diào)整系統(tǒng)結(jié)構(gòu)的工作。)鉤子方法的名字通常以do開(kāi)始。


模板方法模式的實(shí)現(xiàn)

完整代碼示例(code):模板方法模式的實(shí)現(xiàn)很簡(jiǎn)單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用 C++實(shí)現(xiàn),并在 VC 6.0 下測(cè)試運(yùn)行)。

代碼片斷 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;
}

代碼說(shuō)明:由于模板方法模式的實(shí)現(xiàn)代碼很簡(jiǎn)單,因此解釋是多余的。其關(guān)鍵是將通用算法(邏輯)封裝起來(lái),而將算法細(xì)節(jié)讓子類實(shí)現(xiàn)(多態(tài))。

唯一注意的是我們將原語(yǔ)操作(細(xì)節(jié)算法)定義未保護(hù)(Protected)成員,只供模板方法調(diào)用(子類可以)。


適用場(chǎng)景
一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來(lái)實(shí)現(xiàn)。
各子類中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類中以避免代碼重復(fù)。這是O p d y k e 和J o h n s o n 所描述過(guò)的“重分解以一般化”的一個(gè)很好的例子[ O J 9 3 ]。首先識(shí)別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個(gè)調(diào)用這些新的操作的模板方法來(lái)替換這些不同的代碼。
控制子類擴(kuò)展。模板方法只在特定點(diǎn)調(diào)用“h o o k ”操作(參見(jiàn)效果一節(jié)),這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。

相關(guān)文章

  • 通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    這篇文章中我們將通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)講解如何在Ubuntu系統(tǒng)中通過(guò)C語(yǔ)言調(diào)用動(dòng)態(tài)庫(kù)(共享庫(kù))的方法,我們將使用libcurl庫(kù),這是一個(gè)基于客戶端的URL傳輸庫(kù),廣泛用于各種程序和應(yīng)用中以訪問(wèn)網(wǎng)頁(yè)和服務(wù)器數(shù)據(jù),需要的朋友可以參考下
    2024-03-03
  • c語(yǔ)言指針之二級(jí)指針示例

    c語(yǔ)言指針之二級(jí)指針示例

    這篇文章主要介紹了c語(yǔ)言指針中的二級(jí)指針示例,需要的朋友可以參考下
    2014-04-04
  • Qt實(shí)現(xiàn)兩個(gè)獨(dú)立窗口的信號(hào)通信

    Qt實(shí)現(xiàn)兩個(gè)獨(dú)立窗口的信號(hào)通信

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)兩個(gè)獨(dú)立窗口的信號(hào)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 淺談C++性能榨汁機(jī)之偽共享

    淺談C++性能榨汁機(jī)之偽共享

    使給定內(nèi)存位置被一個(gè)線程所訪問(wèn),可能還是會(huì)有乒乓緩存的存在,是因?yàn)榱硪环N叫做偽共享(false sharing)的效應(yīng)。即使數(shù)據(jù)存儲(chǔ)在緩存行中,多個(gè)線程對(duì)數(shù)據(jù)中的成員進(jìn)行訪問(wèn)時(shí),硬件緩存還是會(huì)產(chǎn)生乒乓緩存。本文將介紹C++中的偽共享
    2021-06-06
  • C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例

    C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    這篇文章主要介紹了VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言switch語(yǔ)句詳解

    C語(yǔ)言switch語(yǔ)句詳解

    這篇文章主要為大家介紹了C語(yǔ)言switch語(yǔ)句,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    跳表(skiplist)是一個(gè)非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)簡(jiǎn)單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實(shí)現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼

    vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼

    這篇文章主要介紹了vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-06-06

最新評(píng)論

邮箱| 长顺县| 科技| 三门县| 巧家县| 青海省| 中阳县| 布尔津县| 孝义市| 城市| 周至县| 平凉市| 高台县| 罗田县| 鹤岗市| 抚顺县| 荣昌县| 绍兴县| 绥中县| 精河县| 攀枝花市| 滨州市| 临漳县| 桑植县| 安国市| 广丰县| 华阴市| 兴业县| 永吉县| 长葛市| 循化| 赞皇县| 福建省| 饶阳县| 怀远县| 淳化县| 家居| 安图县| 台南县| 阳新县| 宁陕县|