设计模式之Visitor
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相关推荐
- java 设计模式之Visitor
设计模式之Visitor Visitor定义 作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了c ...
- 【鲁班学院】设计模式—访问者(Visitor)模式
一.定义 访问者模式是一种从操作的对象结构中分离算法的方式. 它可以在不改变数据结构的前提下定义作用与这些元素的新操作.它遵循开闭原则. Represent an operation to be pe ...
- Java 设计模式之 Visitor 访问者模式
Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...
- 设计模式之Visitor访问者模式
1. 抽象类 1.1. 访问者 class Apple; class Pork; class Visitor { public:virtual ~Visitor() = default;virtual ...
- 设计模式:Visitor模式
Visitor模式是一个用起来很简单,理解起来可能稍微有一点困难的模式.不过明白了之后就清楚了,其实也是非常的简单. 问题 需要向对象结构中增加新的方法,但是增加起来会很费劲或者会破坏设计. 案例 举 ...
- java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要 ...
- java的visitor模式_Java设计模式之Visitor模式是什么样的?
作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作 ...
- Spring框架中的设计模式(五)
命令模式 这篇文章描述的第一个行为设计模式是命令.它允许将请求封装在一个对象内并附加一个回调动作(每次遇到所所谓的回调大家就只需要理解为一个函数方法就好,省的去浪费那么多脑子).请求被封装在命令对象之 ...
- [活动]《博客园精华集》设计模式分册第2轮筛选结果公示
说明 <博客园精华集>设计模式分册第2论筛选结果,总共有284篇,主要由TerryLee.idior.怪怪三人完成.在经过第三轮打分之后,还会有很多的文章出局.请大家发现以下文章中有转载或 ...
最新文章
- 控制语句 for while if switch
- C指针原理(4)-ATT汇编
- JSP、EL和JSTL-学习笔记01【JSP基础语法】
- Linux字符串三剑客笔试题集合
- 网络协议入门(OSI七层和TCP/IC四层协议)
- ACMer的AC福音!手动扩栈外挂!(防止栈溢出)
- nvarchar(2048)能写多少个字符_我的拼多多店一个标题能带来多少的免费流量?三个字“非常多”...
- 我们决定聚在一起搞大事
- 又是一岁,又是一年,又是新的开端【我与51CTO的故事】
- micropython websocket_通过websocket登录ESP32
- 标注工具 labelImg 的下载安装及使用
- 82家!北京独角兽企业占全国四成
- 100道MySQL面试题及答案
- mysql表的拆分,外键的添加,删除,级联操作
- 哈工大慕课 学生成绩管理系统V1.0~5.0
- 第六周作业--需求建模
- 关于采样率位深码率无损的一些心得
- 奇虎360 -- 2013年校园招聘技术类笔试题
- pycrypto 和 lua-resty-rsa 进行跨语言的RSA加密解密.md
- 重新回头学习归纳ES6的知识点-------promise(承诺)
热门文章
- UCMA(OCS) 开发系列之二(安装与部署)
- Perl 安装Inline 和 Inline Java模组(windows)
- Windows环境下smarty安装最简明教程 分享
- Kaggle初体验之泰坦尼特生存预测
- android view设置按钮颜色_Android 酷炫自定义 View:高仿 QQ 窗帘菜单
- VScode使用Git拉取代码到本地提示“在签出前,请清理存储工作树”
- php处理post表单数据,php – Httpful post表单数据
- springMVC ---- 异步调用
- springboot启动图标_SpringBoot基础教程
- 小波分析理论与matlabr2007实现_HHT变换基本理论