/*************************************************************************************************************
适用于:
把数据结构 和 作用于数据结构上的操作 进行解耦合;
适用于数据结构比较稳定的场合
访问者模式总结:
访问者模式优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。
访问者模式将有关的行为集中到一个访问者对象中。那访问者模式的缺点是是增加新的数据结构变得困难了

实现数据结构   和操作数据结构的动作     进行有效的分离
实现方法: 
分别定义访问者接口(数据结构的基类指针)    公园部分访问接口(访问者的指针接口)+  接受访问的内部实现了访问函数的调用
如果要管理访问者增加超级访问者,使用集合将其封装,然后遍历集合
**************************************************************************************************************/
/* 案例需求:
比如有一个公园,有一到多个不同的组成部分;该公园存在多个访问者:清洁工A负责打扫公园的A部分,清洁工B负责打扫公园的B部分,
公园的管理者负责检点各项事务是否完成,上级领导可以视察公园等等。也就是说,对于同一个公园,不同的访问者有不同的行为操作,
而且访问者的种类也可能需要根据时间的推移而变化(行为的扩展性)*/
#include <iostream>
#include <list>
#include <string>
using namespace std;
class  ParkElement;
class Visitor//不同的访问者 访问公园完成不同的动作 
{
public:
virtual void visit(ParkElement *park) = 0;
};
class ParkElement//公园不同的部分接受不同的访问者
{
public:
virtual void accept(Visitor *v) = 0;
};
class ParkA : public ParkElement  //公园A部分接受访问者
{
public:
virtual void accept(Visitor *v){
v->visit(this);}//传来的谁,去回调它是访问函数
};
class ParkB : public ParkElement//公园B部分接受访问者
{
public:
virtual void accept(Visitor *v) {
v->visit(this);}
};
class Park : public ParkElement
{ //公园的部分可以进行集中管理
public:
Park(){
m_list.clear(); }
void setPart(ParkElement *e){
m_list.push_back(e);}
public:
void accept(Visitor *v)
{
for (list<ParkElement *>::iterator it = m_list.begin(); it != m_list.end(); it++)
{ (*it)->accept(v);}
}
private:
list<ParkElement *> m_list;
};
class VisitorA : public Visitor//访问者A
{
public:
virtual void visit(ParkElement *park){
cout << "清洁工A 访问 公园A 部分,打扫卫生完毕" << endl;}
};

class VisitorB : public Visitor//访问者B
{
public:
virtual void visit(ParkElement *park){
cout << "清洁工B 访问 公园B 部分,打扫卫生完毕" << endl;}
};
class VisitorManager : public Visitor//访问者管理员
{
public:
virtual void visit(ParkElement *park)
{ cout << "管理员 检查 此部分卫生情况" << endl;}
};

void main()
{
VisitorA *visitorA = new VisitorA;//创建访问者A
VisitorB *visitorB = new VisitorB;//创建访问者B

ParkA *partA = new ParkA;//创建数据结构  A
ParkB *partB = new ParkB;//创建数据结构  B

partA->accept(visitorA); //公园接受访问者A访问 + 在这个函数中封装了visitorA去访问公园A部分
partB->accept(visitorB); //公园接受访问者B访问 + 在这个函数中封装了visitorA去访问公园B部分

VisitorManager *visitorManager = new VisitorManager;
Park * park = new Park;
park->setPart(partA);  //将A部分加入容器
park->setPart(partB);  //将B部分加入容器
park->accept(visitorManager); //管理员去检查A部分 +  管理员去检查B部分
//遍历容器,接受visitorManager访问,去调用visitorManager的访问函数
system("pause");

}

参考:传智播客--王保明

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

  10. C++设计模式——访问者模式

    访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...

最新文章

  1. 服务器架设笔记——多模块和全局数据
  2. AI一分钟 | 谷歌遭特朗普指责;程维、柳青道歉:顺风车业务无限期下线
  3. java extjs如何使用_ExtJS初探:在项目中使用ExtJS
  4. linux内核引入模块机制好处,linux内核模块的版本检查机制
  5. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)
  6. 计算机原理2408,《计算机组成原理实验》课程教学大纲
  7. 数据科学:Oracle 并购 DataScience 公司提升机器学习能力
  8. mro列表_MRO模块操作指导书
  9. 压缩解压缩工具之WinRAR
  10. 远程调用中间件(RPC
  11. 卧槽!字节跳动的面试算法题,实在太变态了
  12. Touch Panel 调试技巧 01
  13. java beanshell_jmeter进阶之Beanshell引用Java代码
  14. 微信H5开发wx.config授权invalid signature
  15. 阿里云移动推送 - 异常记录
  16. 我什么计算机作文600字,我是电脑迷作文600字
  17. 城市规划设计毕业论文范文
  18. mac电脑如何找到usr文件夹
  19. BZOJ4698 Sdoi2008 Sandy的卡片
  20. 数据结构-图、二叉树、B(+)树

热门文章

  1. 记录一下----关于设计模式和面向对象设计原则
  2. #VSTS日志# Xamarin构建支持和一大波更新
  3. Trie图和Fail树
  4. SharePoint 2013 Deploy Master Page And Page Layout
  5. 再谈代码生成器,xml+xslt,结合扩展,用上设计模式。
  6. .Net的文件格式(zz)
  7. Cobbler详解(一)——Cobbler基础知识
  8. eNSP仿真模拟与实际环境的几个不符点
  9. --initialize specified but the data directory has files in it. Aborting.
  10. 江苏新一代物联网全省商用 全省信号覆盖率达97.5%