原文 https://blog.csdn.net/CoderAldrich/article/details/83270301
我敲了代码 做出一些修改

在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。该模式的目的是要把处理从数据结构分离出来。访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中

#include <iostream>
#include <vector>
#include <algorithm>//包含find函数
using namespace std;class ConcreteElementA;
class ConcreteElementB;class Visitor {public:virtual void VisitConcreteElementA(ConcreteElementA *elementA) = 0;virtual void VisitConcreteElementB(ConcreteElementB *elementB) = 0;};class ConcreteVisitor1 : public Visitor {public:void VisitConcreteElementA(ConcreteElementA *elementA);void VisitConcreteElementB(ConcreteElementB *elememtB);
};void ConcreteVisitor1::VisitConcreteElementA(ConcreteElementA *elementA) {cout << "ConcreteVisitor1 ConcreteElEmentA" << endl;
}void ConcreteVisitor1::VisitConcreteElementB(ConcreteElementB *elememtB) {cout << "ConcreteVisitor1 ConcreteElementB" << endl;
}class ConcreteVisitor2 : public Visitor {public:void VisitConcreteElementA(ConcreteElementA *elementA);void VisitConcreteElementB(ConcreteElementB *elememtB);
};void ConcreteVisitor2::VisitConcreteElementA(ConcreteElementA *elementA) {cout << "ConcreteVisitor2 ConcreteElEmentA" << endl;
}void ConcreteVisitor2::VisitConcreteElementB(ConcreteElementB *elememtB) {cout << "ConcreteVisitor2 ConcreteElementB" << endl;
}class Element {public:virtual void Accept(Visitor *visitor) = 0;
};class ConcreteElementA : public Element {public:void Accept(Visitor *visitor);
};void ConcreteElementA::Accept(Visitor *visitor) {visitor->VisitConcreteElementA(this);
}class ConcreteElementB : public Element {public:void Accept(Visitor *visitor);
};void ConcreteElementB::Accept(Visitor *visitor) {visitor->VisitConcreteElementB(this);
}class ObjectStruture {public:void Attach(Element *element);void Detach(Element *element);void Accept(Visitor *visitor);private:vector<Element *> elements_;
};void ObjectStruture::Attach(Element *element) {elements_.push_back(element);
}void ObjectStruture::Detach(Element *element) {vector<Element *>::iterator it = find(elements_.begin(), elements_.end(), element);if (it != elements_.end()) {elements_.erase(it);}
}void ObjectStruture::Accept(Visitor *visitor) {for (vector<Element *>::iterator it = elements_.begin(); \it != elements_.end(); it++) {(*it)->Accept(visitor);}
}int main() {ObjectStruture *object = new ObjectStruture;ConcreteElementA *elementA = new ConcreteElementA;ConcreteElementB *elementB = new ConcreteElementB;object->Attach(elementA);object->Attach(elementB);ConcreteVisitor1 *visitor1 = new ConcreteVisitor1;ConcreteVisitor2 *visitor2 = new ConcreteVisitor2;object->Accept(visitor1);object->Accept(visitor2);if (visitor1) {delete visitor1;}if (visitor2) {delete visitor2;}if (elementA) {delete elementA;}if (elementB) {delete elementB;}
}

输出结果:

ConcreteVisitor1 ConcreteElEmentA
ConcreteVisitor1 ConcreteElementB
ConcreteVisitor2 ConcreteElEmentA
ConcreteVisitor2 ConcreteElementB

原网址:https://blog.csdn.net/finghting321/article/details/105431949

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Element;
class ConcreteElementA;
class ConcreteElementB;
// 访问者
class Visitor{public:virtual void VisitConcreteElementA(ConcreteElementA * p) = 0;virtual void VisitConcreteElementB(ConcreteElementB * p) = 0;
};
// 被访问元素: 定义一个Accept操作,它以一个访问者为参数
class Element {public:Element(std::string str) {m_strName_ = str;}std::string getName() {return m_strName_;}virtual void Accept(Visitor * visitor) = 0;protected:std::string m_strName_;
};
//具体元素A:实现Accept操作,该操作以一个访问者为参数
class ConcreteElementA : public Element {public:ConcreteElementA(std::string str) : Element(str) {}void Accept(Visitor * visitor);
};
void ConcreteElementA::Accept(Visitor * visitor) {visitor->VisitConcreteElementA(this);
}
//具体元素B
class ConcreteElementB : public Element {public:ConcreteElementB(std::string str) : Element(str) {}void Accept(Visitor * visitor);
};
void ConcreteElementB::Accept(Visitor * visitor) {visitor->VisitConcreteElementB(this);
}
// 聚集类对象结构:能够枚举它的元素,同时提供一个高层的接口以允许该访问者访问它的元素
class ObjectStructure {private:std::vector<Element *> m_vec_;public:~ObjectStructure() {for (auto it = m_vec_.begin(); it != m_vec_.end(); it++) {delete *it;}m_vec_.clear();}void add(Element * p) {m_vec_.push_back(p);}void accept(Visitor * visitor) {for (auto it = m_vec_.cbegin(); it != m_vec_.cend(); it++) {(*it)->Accept(visitor);}}
};//具体访问者A
class ConcreteVisitorA : public Visitor {public:void VisitConcreteElementA(ConcreteElementA * p) {std::cout << "ConcreteVisitorA FangWenLe" << p->getName() << std::endl;}void VisitConcreteElementB(ConcreteElementB * p) {std::cout << "ConcreteVisitorA FangWenLe" << p->getName() << std::endl;}
};
//具体访问者B
class ConcreteVisitorB : public Visitor {public:void VisitConcreteElementA(ConcreteElementA * p) {std::cout << "ConcreteVisitorB FangWenLe" << p->getName() << std::endl;}void VisitConcreteElementB(ConcreteElementB * p) {std::cout << "ConcreteVisitorB FangWenLe" << p->getName() << std::endl;}
};int main() {// 访问者模式ObjectStructure * p = new ObjectStructure();p->add(new ConcreteElementA("A"));p->add(new ConcreteElementB("B"));ConcreteVisitorA * pVisitorA = new ConcreteVisitorA();ConcreteVisitorB * pVisitorB = new ConcreteVisitorB();p->accept(pVisitorA);p->accept(pVisitorB);delete pVisitorA;delete pVisitorB;delete p;return 0;
}

输出结果:

ConcreteVisitorA FangWenLeA
ConcreteVisitorA FangWenLeB
ConcreteVisitorB FangWenLeA
ConcreteVisitorB FangWenLeB

C++设计模式——访问者模式(高屋建瓴)相关推荐

  1. 设计模式 访问者模式

    文章目录 访问者模式 访问者模式实战 访问者模式 在相同的数据结构下, 增加容易变化的业务访问逻辑, 为了增强扩展性, 将易变的访问逻辑进行解耦的一种设计模式. 访问者模式实战 模拟学校中, 有老师和 ...

  2. 设计模式---访问者模式

    访问者模式 介绍 定义及使用场景 UML类图 角色 财务案例 个人心得体会 静态分派以及动态分派 静态分派 动态分派 访问者模式中的伪动态双分派 对访问者模式的一些思考 总结 优点 缺点 适用性 参考 ...

  3. C++设计模式——访问者模式(visitor pattern)

    一.原理讲解 1.1意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 1.2应用场景 一个对象结构包含很多类对象,它们有不同的接口,而你 ...

  4. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  5. yii2通过url访问类中的方法_行为型设计模式 访问者模式

    author zong email zongzhe1996@163.com 介绍 在访问者模式中,通过使用一个访问者类,可以改变元素类(被访问者)的执行算法.元素类的执行算法可以随着访问者的改变而改变 ...

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

    目录 基本概念 代码与实例 基本概念 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作. UML图如下(此图来源于大 ...

  7. PHP设计模式——访问者模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 访问者模式表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: 角色 ...

  8. C#设计模式——访问者模式(Vistor Pattern)

    一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...

  9. 大话设计模式—访问者模式

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...

最新文章

  1. FPGA之道(40)HDL的语法结构
  2. Android中的APinner2
  3. C++STL容器,你真的会用了吗?——插入、删除、遍历和查找操作性能对比——删除(精简易懂版,句句干货)
  4. 2018-2019-2 网络对抗技术 20165329 Exp 8 Web基础
  5. pad_sequences序列预处理
  6. 为什么用openstack_如何为OpenStack贡献力量
  7. vuex的命名空间有哪些_javascript – vuex中模块的命名空间究竟是什么
  8. 启动tomcat时遇到的问题
  9. 用Python弹奏周董的《菊花台》是什么效果
  10. 思科ASA防火墙部署和基本配置
  11. [原创工具] SangoExplorer - 《三国群英传》全系列资源浏览器
  12. 我是主考官__博文(作者著有《Java程序员,上班那点事儿》)
  13. Vue+Element动态生成新表单并添加验证
  14. 2019级吉林大学计软实验题目解析
  15. cadence 页间连接符标号的 删除,添加,更新
  16. 卡特兰数 Catalan数
  17. TypeScript (TS
  18. 可以度量金融泡沫的对数周期幂律
  19. Linux - systemd 依赖
  20. 线性布局(LinearLayout)

热门文章

  1. 01组团队项目-Alpha冲刺-5/6
  2. Linux 笔记本电脑选购指南
  3. 牛逼!IDEA 护眼方案来了…
  4. 计算机辅助设计与制造考试题,计算机辅助设计与制造试题.docx
  5. Linux 系统Trouble shouting及修复FATAL: NO bootale medium found! System halted
  6. 基于微信小程序的电影院买票选座系统
  7. iptables实战演练
  8. HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)
  9. android对象序列化,Android序列化总结
  10. HTML学习之块级元素和行内元素的特征和区别(一)