访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。

#include <iostream>
#include <list>
#include<vector>
#include<string>
using namespace std;class Visitor;
// 被访问元素
class Element
{protected:std::string m_strName;
public:Element(std::string str){m_strName = str;}std::string getName(){return m_strName;}virtual void Accept(Visitor * visitor) = 0;
};class ConcreteElementA : public Element
{public:ConcreteElementA(std::string str) : Element(str) {}void Accept(Visitor * visitor);
};class ConcreteElementB : public Element
{public:ConcreteElementB(std::string str) : Element(str) {}void Accept(Visitor * visitor);
};// 访问者
class Visitor
{public:virtual void VisitConcreteElementA(ConcreteElementA * p) = 0;virtual void VisitConcreteElementB(ConcreteElementB * p) = 0;
};class ConcreteVisitorA : public Visitor
{public:void VisitConcreteElementA(ConcreteElementA * p){std::cout << "ConcreteVisitorA 访问了" << p->getName() << std::endl;}void VisitConcreteElementB(ConcreteElementB * p){std::cout << "ConcreteVisitorA 访问了" << p->getName() << std::endl;}
};class ConcreteVisitorB : public Visitor
{public:void VisitConcreteElementA(ConcreteElementA * p){std::cout << "ConcreteVisitorB 访问了" << p->getName() << std::endl;}void VisitConcreteElementB(ConcreteElementB * p){std::cout << "ConcreteVisitorB 访问了" << p->getName() << std::endl;}
};void ConcreteElementA::Accept(Visitor * visitor)
{visitor->VisitConcreteElementA(this);
}
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);}}
};int main()
{using namespace std;// 访问者模式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;getchar();return 0;
}

C++23种设计模式(21)-访问者模式相关推荐

  1. java的string访问某个元素_C#深究.net常用的23种设计模式之访问者模式(Vistor Pattern)...

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

  2. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之访问者模式

    · 访问者模式在王者荣耀中的应用 · 一.简述 在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体.玩家可以自己筹备创建战队.亦可加入其他战队.战队 ...

  3. 23种设计模式之访问者模式

    访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访 ...

  4. 深入理解23种设计模式(14) -- 访问者模式

    介绍 访问者模式 (Visitor Pattern) : 封装一些作用于某种数据结构的各元素操作,它可以在不改变数据结构的前提下定义作用于这些元素新的操作. 主要将数据结构与数据操作分离,解决数据结构 ...

  5. 【Unity与23种设计模式】访问者模式(Visitor)

    GoF中定义: "定义一个能够在一个对象结构中对于所有元素执行的操作.访问者让你可以定义一个新的操作,而不必更改到被操作元素的类接口." 暂时没有完全搞明白 直接上代码 //访问者 ...

  6. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  7. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  8. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  9. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  10. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

最新文章

  1. 用存储过程生成记录编号
  2. 疾风之刃的最新服务器,《疾风之刃》服务器数据互通(合服)提前预览
  3. MS SQL SERVER中备份所有数据库
  4. Java内存模型深度解析:总结
  5. 听着三只松鼠上市的钟声,罗永浩流下了悔恨的泪水
  6. android瀑布流效果(仿蘑菇街)
  7. 如何将 hadoop1.1.2/1.2.1 源码关联到 Eclipse
  8. 【SAS Notes】If then statements
  9. flume 整合kafka
  10. 《21天学通Java(第6版)》—— 1.6 总结
  11. YYKit源码学习——YYMemoryCache
  12. 数据挖掘--决策树ID3+k-means聚类分析西瓜数据
  13. 逻辑学中的思维规律:同一律,不矛盾律,排中律,充足理由律
  14. 超简单的用PS(PhotoShop)转换png为ico,简单的制作favicon.ico,使用画图工具转换PNG为ICO图标,不用下什么插件软件什么玩意儿的
  15. 第二十四篇:SuperSpeed/HighSpeed USB的ISO传输
  16. 辽宁省朝阳市高考成绩查询2021,2021年朝阳高考状元多少分是谁,朝阳高考状元名单资料...
  17. Shell if 条件判断
  18. 前端初学阶段总结与笔记
  19. 同花顺校园招聘笔试题 2014 武汉站
  20. erp故障处理流程图_ERP仓储管理流程图

热门文章

  1. 将数组转化成字符串的两种方法
  2. 最小二乘法的原理理解
  3. 首都机场动力能源公司官方网站全新改版上线
  4. windows10安装gradle
  5. Android Studio——简单视频播放器
  6. Premiere Pro快捷键大全
  7. 多显示器(Multiple Display Monitors)编程-关于多重独立显示(Multiple independent displays)和桌面扩展(Large desktops)
  8. go 图片相似 查找两张图片不同的部分 找出两幅图片中的不同处
  9. linux查看软件安装目录
  10. 音频处理与捕捉:::Audio Repeater Pro