日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++设计模式-访问者模式

發布時間:2025/3/15 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式-访问者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

?

基本概念

代碼與實例


?

基本概念

訪問者模式(Visitor):表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變元素的類的前提下定義作用于這些元素的新操作。

UML圖如下(此圖來源于大話設計模式)

訪問者模式適用于數據結構相對穩定的系統。

訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關行為集中到一個訪問者對象中。

?

代碼與實例

程序運行截圖如下:

源碼如下:

Head.h

#ifndef HEAD_H #define HEAD_H#include <iostream> #include <string> #include <list> #include <algorithm> using namespace std;class ConcreteElementA; class ConcreteElementB;//Visitor類,為該對象結構中ConcreteElement的每一個類聲明一個Visit操作 class Visitor{public:virtual void visitConcreteElementA(ConcreteElementA *concreteElementA) = 0;virtual void visitConcreteElementB(ConcreteElementB *concreteElementB) = 0;virtual ~Visitor(); };//ConcreteVisitor1和ConcreteVisitor2類,具體訪問者,實現每一個由Visitor聲明的操作。 //每一個操作實現算法的一部分,而該算法片斷仍是對應于結構中對象的類。 class ConcreteVisitor1: public Visitor{public:void visitConcreteElementA(ConcreteElementA *concreteElementA);void visitConcreteElementB(ConcreteElementB *concreteElementB);~ConcreteVisitor1();string getName();void setName(const string &name);private:string m_name; };class ConcreteVisitor2: public Visitor{public:void visitConcreteElementA(ConcreteElementA *concreteElementA);void visitConcreteElementB(ConcreteElementB *concreteElementB);~ConcreteVisitor2();string getName();void setName(const string &name);private:string m_name; };//Element類,定義一個Accept操作,它以一個訪問者為參數 class Element{public:virtual void accept(Visitor *visitor) = 0;virtual ~Element(); };//ConcreteElementA和ConcreteElementB類,具體元素,實現Accept操作 class ConcreteElementA: public Element{public:ConcreteElementA(string name);void accept(Visitor *visitor);/*下面還可能有其他的方法*/~ConcreteElementA();string getName();void setName(const string &name);private:string m_name; };class ConcreteElementB: public Element{public:ConcreteElementB(string name);void accept(Visitor *visitor);/*下面還可能有其他的方法*/~ConcreteElementB();string getName();void setName(const string &name);private:string m_name; };class ObjectStructure{public:void attach(Element *element);void detach(Element *element);void accpet(Visitor *visitor);~ObjectStructure(); private:list<Element*> m_list; };#endif

Head.cpp

#include "Head.h"Visitor::~Visitor() {cout << "Visitor::~Visitor()" << endl; }void ConcreteVisitor1::visitConcreteElementA(ConcreteElementA *concreteElementA) {cout << concreteElementA->getName() << " 被 " << this->getName() << "訪問!" << endl; }void ConcreteVisitor1::visitConcreteElementB(ConcreteElementB *concreteElementB) {cout << concreteElementB->getName() << " 被 " << this->getName() << "訪問!" << endl; }ConcreteVisitor1::~ConcreteVisitor1() {cout << "ConcreteVisitor1::~ConcreteVisitor1()" << endl; }std::string ConcreteVisitor1::getName() {return m_name; }void ConcreteVisitor1::setName(const string &name) {m_name = name; }void ConcreteVisitor2::visitConcreteElementA(ConcreteElementA *concreteElementA) {cout << concreteElementA->getName() << " 被 " << this->getName() << "訪問!" << endl; }void ConcreteVisitor2::visitConcreteElementB(ConcreteElementB *concreteElementB) {cout << concreteElementB->getName() << " 被 " << this->getName() << "訪問!" << endl; }ConcreteVisitor2::~ConcreteVisitor2() {cout << "ConcreteVisitor2::~ConcreteVisitor2()" << endl; }std::string ConcreteVisitor2::getName() {return m_name; }void ConcreteVisitor2::setName(const string &name) {m_name = name; }Element::~Element() {cout << "Element::~Element()" << endl; }ConcreteElementA::ConcreteElementA(string name) {m_name = name; }void ConcreteElementA::accept(Visitor *visitor) {visitor->visitConcreteElementA(this); }ConcreteElementA::~ConcreteElementA() {cout << "ConcreteElementA::~ConcreteElementA()" << endl; }std::string ConcreteElementA::getName() {return m_name; }void ConcreteElementA::setName(const string &name) {m_name = name; }ConcreteElementB::ConcreteElementB(string name) {m_name = name; }void ConcreteElementB::accept(Visitor *visitor) {visitor->visitConcreteElementB(this); }ConcreteElementB::~ConcreteElementB() {cout << "ConcreteElementB::~ConcreteElementB()" << endl; }std::string ConcreteElementB::getName() {return m_name; }void ConcreteElementB::setName(const string &name) {m_name = name; }void ObjectStructure::attach(Element *element) {m_list.push_back(element); }void ObjectStructure::detach(Element *element) {m_list.remove(element); }void ObjectStructure::accpet(Visitor *visitor) {for(list<Element*>::iterator it = m_list.begin(); it != m_list.end(); it++){(*it)->accept(visitor);} }ObjectStructure::~ObjectStructure() {cout << "ObjectStructure::~ObjectStructure()" << endl;for(list<Element*>::iterator it = m_list.begin(); it != m_list.end(); it++){delete (*it);}m_list.clear(); }

main.cpp

#include "Head.h"int main(int *argc, int *argv[]){ObjectStructure *o = new ObjectStructure;o->attach(new ConcreteElementA("呵呵"));o->attach(new ConcreteElementB("哈哈"));ConcreteVisitor1 *v1 = new ConcreteVisitor1;v1->setName("哦哦");ConcreteVisitor2 *v2 = new ConcreteVisitor2;v2->setName("嗷嗷");o->accpet(v1);o->accpet(v2);delete o;delete v1;delete v2;getchar();return 0; }

?

總結

以上是生活随笔為你收集整理的C++设计模式-访问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。