Visitor访问者模式定义

作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为.

为何使用Visitor?
Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了.那么我们势必要用If来判断,如:

在上例中,我们使用了 instanceof来判断 o的类型.

很显然,这样做的缺点代码If else if 很繁琐.我们就可以使用Visitor模式解决它.

如何使用Visitor?
针对上例,定义接口叫Visitable,用来定义一个Accept操作,也就是说让Collection每个元素具备可访问性.

被访问者是我们Collection的每个元素Element,我们要为这些Element定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者,被访问者如果表示不欢迎,访问者就不能访问),取名为Visitable,也可取名为Element。

被访问的具体元素继承这个新的接口Visitable:

上面是被访问者是字符串类型,下面再建立一个Float类型的:

我们设计一个接口visitor访问者,在这个接口中,有一些访问操作,这些访问操作是专门访问对象集合Collection中有可能的所有类,目前我们假定有三个行为:访问对象集合中的字符串类型;访问对象集合中的Float类型;访问对象集合中的对象集合类型。注意最后一个类型是集合嵌套,通过这个嵌套实现可以看出使用访问模式的一个优点。

接口visitor访问者如下:

 

访问者的实现:

在上面的visitCollection我们实现了对Collection每个元素访问,只使用了一个判断语句,只要判断其是否可以访问.

StringElement只是一个实现,可以拓展为更多的实现,整个核心奥妙在accept方法中,在遍历Collection时,通过相应的accept方法调用具体类型的被访问者。这一步确定了被访问者类型,

如果是StringElement,而StringElement则回调访问者的visiteString方法,这一步实现了行为操作方法。

客户端代码:

客户端代码中的list对象集合中放置了多种数据类型,对对象集合中的访问不必象一开始那样,使用instance of逐个判断,而是通过访问者模式巧妙实现了。

至此,我们完成了Visitor模式基本结构.

使用Visitor模式的前提
使用访问者模式是对象群结构中(Collection) 中的对象类型很少改变。

在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便.

如果对象集合中的对象集合经常有变化, 那么不但Visitor实现要变化,Visistable也要增加相应行为,GOF建议是,不如在这些对象类中直接逐个定义操作,无需使用访问者设计模式。

但是在Java中,Java的Reflect技术解决了这个问题,因此结合reflect反射机制,可以使得访问者模式适用范围更广了。

转载于:https://www.cnblogs.com/shanghaif/archive/2008/12/08/1350417.html

设计模式之Visitor相关推荐

  1. java 设计模式之Visitor

    设计模式之Visitor Visitor定义 作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了c ...

  2. 【鲁班学院】设计模式—访问者(Visitor)模式

    一.定义 访问者模式是一种从操作的对象结构中分离算法的方式. 它可以在不改变数据结构的前提下定义作用与这些元素的新操作.它遵循开闭原则. Represent an operation to be pe ...

  3. Java 设计模式之 Visitor 访问者模式

    Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...

  4. 设计模式之Visitor访问者模式

    1. 抽象类 1.1. 访问者 class Apple; class Pork; class Visitor { public:virtual ~Visitor() = default;virtual ...

  5. 设计模式:Visitor模式

    Visitor模式是一个用起来很简单,理解起来可能稍微有一点困难的模式.不过明白了之后就清楚了,其实也是非常的简单. 问题 需要向对象结构中增加新的方法,但是增加起来会很费劲或者会破坏设计. 案例 举 ...

  6. java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要 ...

  7. java的visitor模式_Java设计模式之Visitor模式是什么样的?

    作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作 ...

  8. Spring框架中的设计模式(五)

    命令模式 这篇文章描述的第一个行为设计模式是命令.它允许将请求封装在一个对象内并附加一个回调动作(每次遇到所所谓的回调大家就只需要理解为一个函数方法就好,省的去浪费那么多脑子).请求被封装在命令对象之 ...

  9. [活动]《博客园精华集》设计模式分册第2轮筛选结果公示

    说明 <博客园精华集>设计模式分册第2论筛选结果,总共有284篇,主要由TerryLee.idior.怪怪三人完成.在经过第三轮打分之后,还会有很多的文章出局.请大家发现以下文章中有转载或 ...

最新文章

  1. 控制语句 for while if switch
  2. C指针原理(4)-ATT汇编
  3. JSP、EL和JSTL-学习笔记01【JSP基础语法】
  4. Linux字符串三剑客笔试题集合
  5. 网络协议入门(OSI七层和TCP/IC四层协议)
  6. ACMer的AC福音!手动扩栈外挂!(防止栈溢出)
  7. nvarchar(2048)能写多少个字符_我的拼多多店一个标题能带来多少的免费流量?三个字“非常多”...
  8. 我们决定聚在一起搞大事
  9. 又是一岁,又是一年,又是新的开端【我与51CTO的故事】
  10. micropython websocket_通过websocket登录ESP32
  11. 标注工具 labelImg 的下载安装及使用
  12. 82家!北京独角兽企业占全国四成
  13. 100道MySQL面试题及答案
  14. mysql表的拆分,外键的添加,删除,级联操作
  15. 哈工大慕课 学生成绩管理系统V1.0~5.0
  16. 第六周作业--需求建模
  17. 关于采样率位深码率无损的一些心得
  18. 奇虎360 -- 2013年校园招聘技术类笔试题
  19. pycrypto 和 lua-resty-rsa 进行跨语言的RSA加密解密.md
  20. 重新回头学习归纳ES6的知识点-------promise(承诺)

热门文章

  1. UCMA(OCS) 开发系列之二(安装与部署)
  2. Perl 安装Inline 和 Inline Java模组(windows)
  3. Windows环境下smarty安装最简明教程 分享
  4. Kaggle初体验之泰坦尼特生存预测
  5. android view设置按钮颜色_Android 酷炫自定义 View:高仿 QQ 窗帘菜单
  6. VScode使用Git拉取代码到本地提示“在签出前,请清理存储工作树”
  7. php处理post表单数据,php – Httpful post表单数据
  8. springMVC ---- 异步调用
  9. springboot启动图标_SpringBoot基础教程
  10. 小波分析理论与matlabr2007实现_HHT变换基本理论