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

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

詳解C++設計模式編程中對訪問者模式的運用

2020-01-26 14:40:22
字體:
來源:轉載
供稿:網友

訪問者模式(visitor),表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問者模式適用于數據結構相對穩定的系統。它把數據結構和作用于結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。訪問者模式的目的是要把處理從數據結構分離出來。很多系統可以按照算法和數據結構分開,如果這樣的系統有比較穩定的數據結構,又有易于變化的算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得算法操作的增加變得容易。反之,如果這樣的系統的數據結構對象易于變化,經常要有新的數據對象增加進來,就不適合使用訪問者模式。

訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者對象中。通常concreteVisitor可以單獨開發,不必跟concreteElement寫在一起。訪問者的缺點其實也就是使增加新的數據結構變得困難了。

結構圖:

2016316111637382.jpg (734×565)

訪問者模式基本示例代碼

訪問者模式 visitor.h、concreteVisitor.h、element.h、concreteElement.h、objectStructure.h

客戶端 visitorApp.cpp

訪問者模式

visitor.h/************************************************************************  * description: 為該對象結構中ConcreteElement的每一個類聲明一個visit操作  * remark:  ************************************************************************/ #ifndef _VISITOR_H_ #define _VISITOR_H_ class concreteElementA; class concreteElementB; class visitor { public:  visitor(){};  virtual ~visitor(){};  virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) = 0;  virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) = 0; }; #endif// _VISITOR_H_ 

 

concreteVisitor.h

/************************************************************************  * description: 具體訪問者,實現每個由visitor聲明的操作。每個操作實現算法     的一部分,而該算法片斷乃是對應于結構中對象的類  * remark:  ************************************************************************/ #ifndef _CONCRETE_VISITOR_H_ #define _CONCRETE_VISITOR_H_ #include "visitor.h" #include <iostream> using namespace std; class concreteVisitor1 : public visitor { public:  concreteVisitor1(){};  ~concreteVisitor1(){};  virtual void visitConcreteElementA(concreteElementA* pConcreteElementA)  {   cout << "concreteElementA被concreteVisitor1訪問" << endl;   }  virtual void visitConcreteElementB(concreteElementB* pConcreteElementB)  {   cout << "concreteElementB被concreteVisitor1訪問" << endl;    } };  class concreteVisitor2 : public visitor { public:  concreteVisitor2(){};  ~concreteVisitor2(){};  virtual void visitConcreteElementA(concreteElementA* pConcreteElementA)  {   cout << "concreteElementA被concreteVisitor2訪問" << endl;   }  virtual void visitConcreteElementB(concreteElementB* pConcreteElementB)  {   cout << "concreteElementB被concreteVisitor2訪問" << endl;    } }; #endif// _CONCRETE_VISITOR_H_ 

element.h

/************************************************************************  * description: 定義一個accept操作,它以一個訪問者為參數  * remark:  ************************************************************************/ #ifndef _ELEMENT_H_ #define _ELEMENT_H_ class visitor; class element { public:  element(){};  virtual ~element(){};  virtual void accept(visitor* pVisitor) = 0; }; #endif// _ELEMENT_H_ 

  

concreteElement.h

#ifndef _CONCRETE_ELEMENT_H_ #define _CONCRETE_ELEMENT_H_ #include "element.h" #include <iostream> using namespace std; class concreteElementA : public element { public:  concreteElementA(){};  ~concreteElementA(){};  // 充分利用雙分派技術,實現處理與數據結構的分離  virtual void accept(visitor* pVisitor)  {   if (NULL != pVisitor)   {    pVisitor->visitConcreteElementA(this);   }  }  // 其他的相關方法  void operationA()  {   cout << "具體元素A的其他相關方法" << endl;  } }; class concreteElementB : public element { public:  concreteElementB(){};  ~concreteElementB(){};  // 充分利用雙分派技術,實現處理與數據結構的分離  virtual void accept(visitor* pVisitor)  {   if (NULL != pVisitor)   {    pVisitor->visitConcreteElementB(this);   }  }  // 其他的相關方法  void operationB()  {   cout << "具體元素B的其他相關方法" << endl;  } }; #endif// _CONCRETE_ELEMENT_H_ 

 

objectStructure.h

/************************************************************************  * description: 枚舉元素,可以提供一個高層的接口以允許訪問者訪問它的元素  * remark:  ************************************************************************/ #ifndef _OBJECT_STRUCTURE_H_ #define _OBJECT_STRUCTURE_H_ #include "element.h" #include "visitor.h" #include <list> using namespace std; class objectStructure { public:  void attach(element* pElement)  {   m_list.push_back(pElement);  }  void detach(element* pElement)  {   m_list.remove(pElement);  }  void accept(visitor* pVisitor)  {   list<element*>::iterator Iter;   for (Iter = m_list.begin(); Iter != m_list.end(); ++Iter)   {    if (NULL != *Iter)    {     (*Iter)->accept(pVisitor);    }      }  } private:  list<element*> m_list; }; #endif// _OBJECT_STRUCTURE_H_ 

客戶端      

visitorApp.cpp

// visitorApp.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include "objectStructure.h" #include "concreteElement.h" #include "concreteVisitor.h" void freePtr(void* vptr) {  if (NULL != vptr)  {   delete vptr;   vptr = NULL;  } } int _tmain(int argc, _TCHAR* argv[]) {  objectStructure* pObject = new objectStructure();  if (NULL != pObject)  {   element* pElementA = new concreteElementA();   element* pElementB = new concreteElementB();   pObject->attach(pElementA);   pObject->attach(pElementB);   concreteVisitor1* pVisitor1 = NULL;   pVisitor1 = new concreteVisitor1();   concreteVisitor2* pVisitor2 = NULL;   pVisitor2 = new concreteVisitor2();   pObject->accept(pVisitor1);   pObject->accept(pVisitor2);   system("pause");   freePtr(pVisitor2);   freePtr(pVisitor1);   freePtr(pElementB);   freePtr(pElementA);   freePtr(pObject);  }  return 0; } 

使用訪問者模式的優點和缺點

訪問者模式有如下的優點:

  • 訪問者模式使得增加新的操作變得很容易。如果一些操作依賴于一個復雜的結構對象的話,那么一般而言,增加新的操作會很復雜。而使用訪問者模式,增加新的操作就意味著增加一個新的訪問者類,因此,變得很容易。
  • 訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。
  • 訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。迭代子只能訪問屬于同一個類型等級結構的成員對象,而不能訪問屬于不同等級結構的對象。訪問者模式可以做到這一點。
  • 積累狀態。每一個單獨的訪問者對象都集中了相關的行為,從而也就可以在訪問的過程中將執行操作的狀態積累在自己內部,而不是分散到很多的節點對象中。這是有益于系統維護的優點。

訪問者模式有如下的缺點:

  • 增加新的節點類變得很困難。每增加一個新的節點都意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者類中增加相應的具體操作。
  • 破壞封裝。訪問者模式要求訪問者對象訪問并調用每一個節點對象的操作,這隱含了一個對所有節點對象的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的訪問就變得沒有意義。由于訪問者對象自己會積累訪問操作所需的狀態,從而使這些狀態不再存儲在節點對象中,這也是破壞封裝的。

訪問者模式的適用場景:

  • 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。
  • 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。Vi s i t o r 使得你可以將相關的操作集中起來定義在一個類中。當該對象結構被很多應用共享時,用Vi s i t o r 模式讓每個應用僅包含需要用到的操作。
  • 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那么可能還是在這些類中定義這些操作較好。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品美女视频网站| 欧美精品手机在线| 久久97久久97精品免视看| 亚洲色图色老头| 欧美日韩福利电影| 午夜精品久久久久久久久久久久| 国产精品99久久久久久久久| 91精品一区二区| 午夜精品福利电影| 欧美日韩中文字幕在线| 在线丨暗呦小u女国产精品| 日韩在线激情视频| 精品久久久久久久久久久久久| 亚洲天堂男人天堂女人天堂| 亚洲美女在线看| 欧美高清在线视频观看不卡| 欧美一级大片在线免费观看| 欧美激情手机在线视频| 中文字幕不卡在线视频极品| 日本精品免费一区二区三区| 亚洲激情自拍图| 中文字幕日韩精品在线| 亚洲日韩欧美视频一区| 亚洲情综合五月天| 亚洲精品免费在线视频| 日韩精品视频在线观看网址| 久久久久久久久久婷婷| 国产精品久久久久不卡| 91精品国产91久久久久久不卡| 久久久电影免费观看完整版| 欧美激情网站在线观看| 欧美大片网站在线观看| 亚洲精品美女久久久| 欧美日韩在线视频一区二区| 亚洲天堂网站在线观看视频| 欧美性xxxx| 亚洲男人7777| 欧美一区二粉嫩精品国产一线天| 欧美一区二区三区四区在线| 欧美日韩日本国产| 国产欧美va欧美va香蕉在线| 亚洲精品美女久久久久| 国产免费亚洲高清| 国产91在线播放九色快色| 亚洲一区二区久久久久久久| 日韩在线视频网| 欧美午夜视频一区二区| 欧美精品久久一区二区| 欧美激情二区三区| 热re99久久精品国产66热| 亚洲精品视频网上网址在线观看| 在线一区二区日韩| 久久久在线视频| 亚洲a级在线观看| 久久精品影视伊人网| 欧美极品美女电影一区| 高潮白浆女日韩av免费看| 92国产精品久久久久首页| 国产精品久久久久久久久久久久久久| 91精品久久久久久| 国产成人精品999| 国产精品入口尤物| 九色精品免费永久在线| 81精品国产乱码久久久久久| 欧美第一淫aaasss性| 日本午夜精品理论片a级appf发布| 热久久美女精品天天吊色| 欧美亚洲在线播放| 国产精品久久久久久久7电影| 久久综合久久88| 欧美日韩国产一区在线| 成人免费在线视频网址| 国产精品专区h在线观看| 国产欧美在线视频| 欧美视频精品一区| 一区二区三区动漫| 欧美激情精品久久久久久黑人| 欧美激情三级免费| 精品少妇一区二区30p| 国产精品久久久久久搜索| 欧美午夜电影在线| 97国产成人精品视频| 国产精品第8页| 日韩电影大全免费观看2023年上| 欧美激情高清视频| 国产精品亚洲网站| 97视频在线观看网址| 亚洲男人天堂古典| 欧美一区二区三区艳史| 一个人看的www欧美| 日韩欧美国产一区二区| 国内精品久久久久久久| 国产精品老女人精品视频| 欧美性xxxxx| 亚洲成色777777在线观看影院| 69久久夜色精品国产69乱青草| 色综合色综合久久综合频道88| 欧美综合第一页| 丝袜美腿亚洲一区二区| 91九色国产在线| 亚洲天堂成人在线视频| 福利一区福利二区微拍刺激| 成人国产精品一区| 亚洲自拍偷拍在线| 国产成人精品综合久久久| 亚洲娇小xxxx欧美娇小| 亚洲图中文字幕| 欧美在线一区二区三区四| 亚洲免费伊人电影在线观看av| 欧美专区在线视频| 中文字幕日韩电影| 日韩av第一页| 亚洲性视频网站| 欧美高跟鞋交xxxxhd| 69久久夜色精品国产69| 国产精品aaa| 国产精品嫩草影院久久久| 美女av一区二区| 日韩国产激情在线| 欧美插天视频在线播放| 97在线看免费观看视频在线观看| 九九热精品在线| 国产精品视频男人的天堂| 91麻豆国产语对白在线观看| 欧美性生交大片免网| 91精品国产自产在线观看永久| 欧美性猛交xxxx富婆| 国产精品午夜国产小视频| 久久久久久一区二区三区| 精品日本美女福利在线观看| 91精品国产91| 久久精视频免费在线久久完整在线看| 欧美高清视频在线观看| xxx一区二区| 亚洲精品中文字幕女同| 欧美成年人视频网站| 欧美激情日韩图片| 中文字幕日本欧美| 久久久欧美精品| 日韩av不卡电影| 国模视频一区二区| 亚洲天堂男人天堂女人天堂| 国产日本欧美视频| 久久大大胆人体| 中文字幕成人精品久久不卡| 欧美亚洲伦理www| 欧美日韩美女在线| 在线观看欧美日韩国产| 亚洲综合中文字幕68页| 日韩精品免费观看| 久久精品成人动漫| 国产一区二区三区在线观看视频| 青青草原成人在线视频| 在线丨暗呦小u女国产精品| 欧美体内谢she精2性欧美| 亚洲国产99精品国自产| 久久视频国产精品免费视频在线| 91夜夜未满十八勿入爽爽影院| 欧美韩国理论所午夜片917电影| 日韩美女视频免费在线观看| 欧美成人精品影院| 欧美日韩在线免费观看| 亚洲欧美日韩爽爽影院| 亚洲视频在线观看|