国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2020-01-26 14:42:16
字體:
供稿:網(wǎng)友

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

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

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

模版方法模式中的方法

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

模版方法

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

基本方法

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

  • 抽象方法:一個(gè)抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在C#語言里一個(gè)抽象方法以abstract關(guān)鍵字標(biāo)示出來。
  • 具體方法:一個(gè)具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。在C#語言里面,一個(gè)具體方法沒有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開始。


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

完整代碼示例(code):模板方法模式的實(shí)現(xiàn)很簡單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用 C++實(shí)現(xiàn),并在 VC 6.0 下測試運(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...PrimitiveOperation1"<<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;}

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

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


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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 孟州市| 分宜县| 邯郸市| 太湖县| 昭通市| 普洱| 蒲江县| 淅川县| 区。| 富川| 黔东| 云浮市| 霍山县| 东城区| 孟连| 凤山县| 蕲春县| 汝城县| 滨州市| 扬中市| 纳雍县| 天津市| 龙海市| 汕头市| 托克托县| 万宁市| 沙河市| 阿克| 同江市| 玛纳斯县| 北海市| 云龙县| 宁波市| 临清市| 高邑县| 通许县| 长丰县| 溧阳市| 商水县| 建平县| 黎川县|