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

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

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

2020-05-23 14:06:33
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式編程中對訪問者模式的運用,訪問者模式在不破壞類的前提下為類提供增加新的新操作,需要的朋友可以參考下
 

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

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

結構圖:

C++設計模式編程,對訪問者模式

訪問者模式基本示例代碼

訪問者模式 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
亚洲午夜未满十八勿入免费观看全集| 亚洲欧美精品一区| 成人黄色在线观看| 国产成人啪精品视频免费网| 国产精品99免视看9| 久久福利视频网| 国产精品自拍偷拍视频| 91国语精品自产拍在线观看性色| 亚洲视频日韩精品| 亚洲精品国产suv| 91在线视频一区| 亚洲性av网站| 91chinesevideo永久地址| 欧美极品少妇全裸体| 亚洲精品在线观看www| 日韩视频永久免费观看| 中文字幕日韩有码| 精品国产一区二区三区久久久狼| 成人av在线亚洲| 国产精品久久久久久久电影| 国产亚洲精品久久| 国产成人精品免费久久久久| 亚洲国产精品小视频| 国产精品扒开腿做爽爽爽视频| 68精品国产免费久久久久久婷婷| 欧美精品www| 欲色天天网综合久久| 欧美富婆性猛交| 欧美日韩黄色大片| 日韩av电影在线网| 亚洲欧洲国产伦综合| 欧美黑人狂野猛交老妇| 亚洲福利在线视频| 国产精品福利网| 欧美网站在线观看| 97久久精品在线| 亚洲一级一级97网| 欧美亚洲视频在线观看| 性欧美视频videos6一9| 日韩精品在线电影| 伊人激情综合网| 亚洲综合在线播放| 久久国产精品久久国产精品| 欧美高清视频在线观看| 日本免费在线精品| 中文字幕无线精品亚洲乱码一区| 国产97人人超碰caoprom| 日韩av在线网址| 国内精品小视频在线观看| 欧美夫妻性视频| 综合国产在线观看| 欧美影院在线播放| 成人a级免费视频| 伊人精品在线观看| 久久久久久91| 国产成人一区二| 亚洲美女中文字幕| 91精品国产综合久久久久久久久| 久久久久久久电影一区| 国产精品成熟老女人| 国产91精品黑色丝袜高跟鞋| 亚洲欧美中文日韩v在线观看| 亚洲人成电影网| 精品久久久久久久大神国产| 国产精品一区二区久久久久| 久久天堂av综合合色| 国产经典一区二区| 国产激情视频一区| 国产亚洲欧洲高清| 青青久久av北条麻妃黑人| 欧美综合在线第二页| 欧美人成在线视频| 欧美孕妇毛茸茸xxxx| 2019av中文字幕| 中文字幕av一区二区| 亚洲区中文字幕| 在线日韩第一页| 日韩中文字幕精品视频| 国产精品白丝av嫩草影院| 2018中文字幕一区二区三区| 成人激情在线播放| 久久久999国产精品| 欧美日韩人人澡狠狠躁视频| 亚洲а∨天堂久久精品9966| 亚洲第一av网站| 国产成人jvid在线播放| 亚洲va欧美va国产综合剧情| 欧美日韩国产二区| 亚洲人成在线观| 国产亚洲精品久久久优势| 日日骚久久av| 日韩男女性生活视频| 日本一区二区不卡| 5566成人精品视频免费| 精品国产老师黑色丝袜高跟鞋| 亚洲精品一区二三区不卡| 九九久久久久久久久激情| 精品日韩视频在线观看| 亚洲男人第一网站| 国产成人jvid在线播放| 日韩中文在线中文网在线观看| 国产精品最新在线观看| 欧美视频精品一区| 中文字幕一区电影| 国产精品视频一区二区高潮| 欧美精品video| 亚洲韩国欧洲国产日产av| 亚洲一级免费视频| 九九视频这里只有精品| 国产在线一区二区三区| 国产精品最新在线观看| 久精品免费视频| 国产做受69高潮| 欧美激情精品久久久久久免费印度| 欧美成人合集magnet| 欧美中文字幕第一页| 日韩在线视频二区| 日韩精品视频观看| 欧美理论在线观看| 久久伊人免费视频| 欧美成人午夜剧场免费观看| 久久影视电视剧免费网站清宫辞电视| 国产精选久久久久久| 国产精品www| 91av在线网站| 97超碰蝌蚪网人人做人人爽| 久久久精品一区二区三区| 青青久久aⅴ北条麻妃| 久久精品人人做人人爽| 97在线免费视频| 8x海外华人永久免费日韩内陆视频| 欧美区二区三区| 久久免费国产精品1| 久久久久这里只有精品| 欧美丰满少妇xxxxx| 亚洲美女又黄又爽在线观看| 久久久久国产视频| 国产精品成人观看视频国产奇米| 精品国产91久久久久久| 久久精品视频在线| www.欧美精品一二三区| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品电影网站| 亚洲一区国产精品| 一区二区福利视频| 97免费中文视频在线观看| 亚洲精品999| 91在线观看免费观看| 国产成人精品亚洲精品| 韩国三级日本三级少妇99| 亚洲91精品在线| 中文一区二区视频| 成人av色在线观看| 在线电影av不卡网址| 亚洲精品国产suv| 国产91ⅴ在线精品免费观看| 高潮白浆女日韩av免费看| 久久久久久久久久久久av| 日韩欧美主播在线| 亚洲无亚洲人成网站77777| 亚洲天堂精品在线| 久久国产精品亚洲| 亚洲激情在线观看视频免费| 日本一区二区在线免费播放|