形象例子:

  情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针 对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一 束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:

  访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模
式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的
很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的
对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

作用:
  表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.

UML结构图:

解析:
  Visitor
模式把对结点的访问封装成一个抽象基类,通过派生出不同的类生成新的访问方式.在实现的时候,在visitor抽象基类中声明了对所有不同结点进行访问的
接口函数,如图中的VisitConcreateElementA函数等,这样也造成了Visitor模式的一个缺陷--新加入一个结点的时候都要添加
Visitor中的对其进行访问接口函数,这样使得所有的Visitor及其派生类都要重新编译了,也就是说Visitor模式一个缺点就是添加新的结点
十分困难.另外,还需要指出的是Visitor模式采用了所谓的"双重分派"的技术,拿上图来作为例子,要对某一个结点进行访问,首先需要产生一个
Element的派生类对象,其次要传入一个Visitor类派生类对象来调用对应的Accept函数,也就是说,到底对哪种Element采用哪种
Visitor访问,需要两次动态绑定才可以确定下来,具体的实现可以参考下面实现代码中的Main.cpp部分是如何调用这些类的.

最新文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
  2. ASP.NET vNext总结:EntityFramework7
  3. Android基础之Activity四种启动模式
  4. C++ 函数返回数组指针的问题
  5. nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
  6. hive 中出现struct 结构化的问题
  7. js 分割循环
  8. ASP.NET Web API 自定义 HttpParameterBinding
  9. pycharm 2017新建文件添加编码方式等
  10. 动态规划——Frog Jump
  11. xmanager 开启X11转发失败问题解决
  12. Java实现将文件或者文件夹压缩成zip
  13. 通过反射实现IOC功能
  14. node.js取参四种方法req.body,req.params,req.param,req.body
  15. PHP删除空格函数
  16. Starting MySQL...The server quit without updating PID file [失败]local/mysql/data/localhost.localdomain.pid报错
  17. 随手练——洛谷-P1002 过河卒(动态规划入门)
  18. BAPI_MATERIAL_SAVEDATA
  19. es6-函数的扩展
  20. 爪哇国新游记之二十九----访问URL获取输入流

热门文章

  1. MySQL中字符串函数详细介绍
  2. ECNU1101-Dinic
  3. What is the innovator’s solution——什么才是创新的解决方案2
  4. ajax的GET和POST请求
  5. MyBatis之传入参数parameterType
  6. ajax跨域访问的解决方案
  7. Linux下Nginx+Tomcat整合的安装与配置
  8. AC题目简解-dp
  9. D3DXCOLOR 和 D3DCOLOR 和 D3DCOLORVALUE
  10. *MySQL卸载之后无法重装,卡在Apply security settings:Error Nr.1045