访问者模式,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模式, 可以不修改已有类的情况下,增加新的操作. 二.访问者模式的应用示例 比如有一 ...
随机推荐
- JAVA 集合List,数组,Set,Map,直接的相互转换
Java集合转换[List<-->数组.List<-->Set.数组<-->Set.Map-->Set.Map-->List] //List--> ...
- python核心编程学习记录之基础知识
虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...
- django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...
- jeditable参数详解
一.导入js文件 <script type="text/javascript" src="jquery-1.10.2.min.js"></sc ...
- MySQL数据很大的时候
众所周知,mysql在数据量很大的时候查询的效率是很低的,因为假如你需要 OFFSET 100000 LIMIT 5 这样的数据,数据库就需要跳过前100000条数据,才能返回给你你需要的5条数据.由 ...
- Windows下打包Python的exe可执行文件
参考:http://www.cnblogs.com/Lands-ljk/p/5447723.html
- UVA 12950 : Even Obsession(最短路Dijkstra)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- vi复制文字
可以对文字使用标记,在光标处使用 ma 将该行标记为a,可用`a (反引号)定位到该标记a位置,用'a (单引号)定位到该行行首. d$删除光标位置到行尾,y$取光标位置到行尾.d和y也可配合标记使用 ...
- js作用域链与this
this的绑定与function和对象的定义位置无关,是由函数调用时的执行环境所决定的. scope chain是由函数定义时的位置决定的与函数调用时的执行环境无关.
- LeetCode----67. Add Binary(java)
package addBinary67;/* Given two binary strings, return their sum (also a binary string).For example ...