访问者模式

Vistor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Vistor模式,可以不修改已有类的情况下,增加新的操作角色和职责。

抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。

具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。

抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量。

具体节点(ConcreteElement)角色:实现了抽象元素所规定的接受操作。

结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。

适用于

把数据结构 和 作用于数据结构上的操作 进行解耦合; 适用于数据结构比较稳定的场合

访问者模式总结

访问者模式优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
那访问者模式的缺点是是增加新的数据结构变得困难了

优缺点

访问者模式有如下的优点:

  1. 访问者模式使得增加新的操作变得很容易。如果一些操作依赖于一个复杂的结构对象
    的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味
    着增加一个新的访问者类,因此,变得很容易。
  2. 访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。
  3. 访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。迭代子只
    能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象。访问
    者模式可以做到这一点。
  4. 积累状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的过
    程中将执行操作的状态积累在自己内部,而不是分散到很多的节点对象中。这是有益于系
    统维护的优点。

访问者的缺点:

  1. 增加新的节点类变得很困难。每增加一个新的节点都意味着要在抽象访问者角色中增
    加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。
  2. 破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含了
    一个对所有节点对象的要求:它们必须暴露一些自己的操作和内部状态。不然,访问者的
    访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态
    不再存储在节点对象中,这也是破坏封装的。

案例需求:

比如有一个公园,有一到多个不同的组成部分;该公园存在多个访问者:清洁工 A 负责打扫公园的 A 部分,清洁工 B 负责打扫公园的 B 部分,公园的管理者负责检点各项事务是否完成,上级领导可以视察公园等等。也就是说,对于同一个公园,不同的访问者有不同的行为操作,而且访问者的种类也可能需要根据时间的推移而变化(行为的扩展性)。
根据软件设计的开闭原则(对修改关闭,对扩展开放),实现需求。

//
// Created by andrew on 2020/11/28.
//
#include <iostream>
#include <list>using namespace std;class ParkElement;class Visitor{public:virtual ~Visitor() = default;virtual void visit(ParkElement *parkElement) = 0;
};class ParkElement{public:virtual ~ParkElement() = default;virtual void accept(Visitor *visitor) = 0;
};class ParkA : public ParkElement{public:void accept(Visitor *v) override{// 公园接收访问者, 让访问者操作v->visit(this);}
};class ParkB : public ParkElement{public:void accept(Visitor *v) override{v->visit(this);}
};// 整个公园
class Park : ParkElement {public:Park(){m_list.clear();}void setParkElement(ParkElement *pe){m_list.push_back(pe);}void accept(Visitor *v) override{for(auto it=m_list.begin();it!=m_list.end(); it++){(*it)->accept(v);}}private:list<ParkElement *>m_list;
};class VisitorA : public Visitor{void visit(ParkElement *parkElement) override {cout << "part A is clear" << endl;}
};class VisitorB : public Visitor {public:void visit(ParkElement *parkElement) override{cout << "part B is clear" << endl;}
};class ManagerVisitor : public Visitor {public:void visit(ParkElement * parkElement) override {cout << "visit all part" << endl;}
};void PartVisitor() {Visitor *vA = new VisitorA;Visitor *vB = new VisitorB;auto *parkA = new ParkA;auto *parkB = new ParkB;parkA->accept(vA);parkB->accept(vB);delete vA;delete vB;delete parkB;delete parkA;
}void ManagerVisit() {Visitor *vManager = new ManagerVisitor;Park *park = new Park;ParkElement *parkA = new ParkA;ParkElement *parkB = new ParkB;park->setParkElement(parkA);park->setParkElement(parkB);//    整个公园接受管理员的访问park->accept(vManager);delete parkA;delete parkB;delete park;delete vManager;
}int main(int argc, char* argv[]){PartVisitor();ManagerVisit();return 0;
}

23种设计模式C++源码与UML实现--访问者模式相关推荐

  1. 23种设计模式C++源码与UML实现--外观模式

    外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...

  2. 23种设计模式C++源码与UML实现--建造者模式

    建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...

  3. 23种设计模式C++源码与UML实现--迭代器模式

    迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...

  4. 23种设计模式C++源码与UML实现--命令模式

    命令模式 Command模式也叫命令模式,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 在面向对象的程序设计中,一个对象调用另外一个对象 ...

  5. 23种设计模式C++源码与UML实现--原型模式

    原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...

  6. 23种设计模式C++源码与UML实现--桥接模式

    桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...

  7. 23种设计模式C++源码与UML实现--状态模式

    状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...

  8. 23种设计模式C++源码与UML实现--策略模式

    策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...

  9. 23种设计模式C++源码与UML实现--组合模式

    组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...

最新文章

  1. NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
  2. 将多个图片转换成PDF文件-img2pdf
  3. 作业二:编写一个自动生成四则运算的程序
  4. iap如何初始化_IAP超级详解
  5. C++ 动态创建按钮及 按钮的消息响应
  6. 激战2:逐火之路-概念艺术设计
  7. shell脚本中数组的使用_Shell脚本中的数组
  8. 调用wsdl的接口-用axis
  9. VC++6.0环境下调试c语言代码的方法和步骤_附图
  10. 树莓派百度云下载工具bypy
  11. HTB靶机:RainyDay
  12. 从春招到秋招,我的曲折网易路 | 掘金技术征文
  13. 【Web前端】一文带你吃透HTML(完整篇)
  14. SHERlocked93 的 2019 年终总结
  15. Unity CardboardSDK解析
  16. CentOS常用命令50个含示例
  17. 缓存穿透,缓存击穿,缓存雪崩
  18. uva 11355(极角计算)
  19. Scrapy模块爬取中华英才网招聘信息(分页)
  20. python 函数 求 圆的周长及面积;三角形的面积

热门文章

  1. WinForm 自定义控件属性
  2. struts声明式异常
  3. 技术上根本不思进取的金山词霸2007
  4. 面试(后台开发,转载)
  5. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
  6. GIS讲堂第二课-地图切片简介以及OL中的调用
  7. 工作中常用的正则表达式
  8. The Joy of Clojure – Clojure philosophy(1)
  9. Delphi将输入汉字自动产生拼音简码
  10. DataGrid中添加背景