访问者模式,visitor
定义:
表示作用于某对象结构中的各个元素的操作。
可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
前提:
适用于数据结构(Element)相对稳定的系统,这样visitor中的方法就是稳定的。
不适用与数据结构易于变化的情况,不适用与此模式。如果总是有具体的Element加进来,visitor就需要增加新的方法,所有子类也需要增加,不符合开放-封闭原则。
例如:算法和数据结构(前提:有比较稳定的数据结构),需要易于变化的算法,使得算法操作的增删改变得容易。
优点:
把数据结构和作用于结构上的操作之间的耦合解开,使得操作集合可以相对自由地演化。即:把数据处理从数据结构分离出来。
增加新的操作很容易。增加新的操作意味着增加一个新的访问者(visitor),访问者模式将有关的行为集中到一个抽象对象中。
visitor可以单独开发,不必Element写在一起。visitor可以提高Element间的独立性。否则,每新增处理方法已扩充功能时,就必须修改ConcreteElementA、ConcreteElementB
缺点:
增加新的数据结构变得困难。
Tip:
很难找到数据结构不变化的情况,使用访问者模式的机会不多。
大多时候并不需要访问者模式,但当一旦需要访问者模式时,就针对需要它了。
访问者模式的能力、复杂性是把双刃剑,只有真正需要的时候,才可以考虑使用。
需要好好理解其适用性。
结构图:



Visitor调用Element;Element调用Visitor。双分派技术,处理实现与数据结构分离。
示例:

抽象类:关键在于人的分类(男人、女人)是稳定的。所以状态类中方法(男人反应、女人反应)个数是稳定的。抽象类人的抽象方法Accept(),用来获得状态对象。

具体状态类:


男人、女人类:
使用双分派技术:
第一次分派:将具体状态作为参数传递给“具体(男人、女人)类”。数据结构调用操作
第二次分派:具体(男人、女人)类调用“状态类”中的“男人、女人反应”,同时将自己(this:男人类、女人类)作为参数传递进去。操作使用数据结构中的数据
意味着:执行的操作取决于请求的种类(具体状态类)和接收者类型(男人、女人)。Accept()就是一个双分派的操作。

对象结构类:
针对不同状态,遍历男人、女人,得到不同反应

客户端:


优点:
增加状态(结婚……),查看男人、女人放映,只需增加一个状态子类,客户端调用查看即可,不用改动其他任何类的代码。
完美体现了“开放-封闭”原则。
对比:


客户端:


结果:

访问者模式,visitor的更多相关文章
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 访问者模式 Visitor 行为型 设计模式(二十七)
访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- 访问者模式(Visitor Pattern)——操作复杂对象结构
模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...
- 十一个行为模式之访问者模式(Visitor Pattern)
定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- [设计模式] 23 访问者模式 visitor Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...
- 学习笔记——访问者模式Visitor
访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用 ...
- 24访问者模式Visitor
一.什么是访问者模式 Visitor模式也叫访问者模式,是行为模式之一 ,它分离对象的数据和行为,使用Visitor模式, 可以不修改已有类的情况下,增加新的操作. 二.访问者模式的应用示例 比如有一 ...
随机推荐
- 【转】SQL Server T-SQL高级查询
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...
- SQL内连接与外连接的区别【转】
--表stuid name 1, Jack2, Tom3, Kity4, nono--表examid grade1, 562, 7611, 89 内连接 (显示两表id匹配的)select stu.i ...
- oracle 11g升级
手先需要下载oracle11g的补丁安装包,一般只有付费用户才能获取到该安装包,其他用户获取不到,那怎么办呢? 万能的互联网可以办到,可以用http://www.wangpansou.cn/所有其他用 ...
- Java的深度克隆和浅度克隆
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来.clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这 ...
- Xcode运行的错误bug收集
libopencore-amrnb.a(wrapper.o)' does not contain bitcode. You must rebuild it with bitcode enabled ( ...
- OpenStack集成Docker
声明:绝对原创,欢迎转载,但请标明出处,谢谢! 最近在做openstack与Docker的集成工作,走了不少弯路,遇到不少问题,不过最终搭建成功了.现在将过程分享出来,以供参考. 一.环境介绍 1.软 ...
- PHP String 函数
[http://www.w3school.com.cn/php/php_ref_string.asp ] PHP String 简介 String 字符串函数允许您对字符串进行操作. 安装 Strin ...
- java面试每日一题11
题目:求1+2!+3!+...+20!的和 public class Recursion { public static void main(String args[]) throws NumberF ...
- 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)
转载注明原地址:http://blog.csdn.net/nk_test/article/details/49497017 少年,作为苦练ACM,通宵刷题的你 是不是想着有一天能够荣登各大OJ榜首,俯 ...
- 转载-Python学习笔记之文件读写
Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...