- 2
- 0
- 约1.6千字
- 约 16页
- 2018-07-18 发布于湖北
- 举报
访问者模式
产生原因
模式定义与结构
实例分析
优缺点
总结
问题提出
如果某系统已经完成了一个类层次并提供了满足需求的所有接口,现在要增加新的需求,我们需要怎么做?
可能你会采用增加该需求并把整个层次结构统统修改一遍?
然而如果需求变动会不停的发生,而且需求的任何变动都会让整个结构统统修改一遍,此时你会怎么做呢?
所以,我们现在需要对这个系统结构进行重构,访问者模式也许就是你解决上面问题最好的选择.
那么什么是访问者模式呢?
访问者模式
模式定义
访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。
顾名思义
使用这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的“访问者”完成对已有代码功能的提升。
注意:不同的访问者其访问方式有所不同
访问者模式
访问者模式——模式结构
访问者模式包含如下角色:
Vistor: 抽象访问者
ConcreteVisitor: 具体访问者
Element: 抽象元素
ConcreteElement:具体元素
ObjectStructure:对象结构
访问者模式——实例
购物车
顾客在超市中将选择的商品,如苹果、图书等放在购物车中,然后到收银员处付款。在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品。此时,购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品,而顾客和收银员作为访问这些商品的访问者,他们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同,如苹果需要过秤之后再计价,而图书不需要。使用访问者模式来设计该购物过程。
购物车
代码-元素
代码-访问者
代码-对象结构
代码-主函数实现
访问者模式——优点
提出问题:
现在遇到一个问题:要向原来的购物车类层次增加一个新的操作——工商局的检查超市产品的生产日期,怎么解决呢?
解决方法:
仅仅需要添加一个具体的访问者角色即可,而不必修改整个类层次,这样就符合“开闭原则”的需求。
而且每个访问者角色都对应一个相关的操作,当需要修改一个具体的访问者角色时仅仅修改该访问者角色,而不是修改整个类层次.
综上问题访问者模式的优点为:
1.增加新的访问操作变得容易;
2.将有关元素对象的访问行为集中到一个访问者对象中,而不是分散到各个元素类中;
3.用户能在不修改类层次结构情况下定义该类层次结构的操作并修改.
购物车——增加新操作”工商局”
访问者模式——缺点
提出问题:
现在遇到一个问题:要向原来的购物车类层次增加一个新的元素“Pen”,或者“Book”元素需要改变,怎么解决呢?
解决方法:
你必须要修改访问者角色和每一个具体访问者角色,对应的访问者每一个函数的参数都要相应的变化.
缺点一:访问者模式增加新的元素很困难,每增加一个新的元素或修改一个元素,就要对相应的访问者类进行修改,违背了“开闭原则”。
而且访问者角色要执行与角色相关的操作,就必须让元素的内部属性暴露出来,在java中就意味着对象可以访问,这就破坏了元素的封装性。
缺点二:破坏封装性。
缺点三:而且访问者之间能够传递的信息有限,这就往往会限制访问者模式的使用。
购物车——修改”Book”
总结
这是一个巧妙而又复杂的模式,它的使用条件 比较苛刻.
当系统存在固定的数据结构(类层次),又有不同的行为,那么访问者模式是个不错的选择.
如果需要修改或增加元素时,就不应该使用访问者模式.
访问者模式要尽可能的将对象浏览逻辑存放在Visitor类中,而不是放在它的子类中;这样ConcreteVisitor类所访问的对象结构依赖较少,便于维护。
您可能关注的文档
最近下载
- 电子病历系统应用水平四级实证材料通用模板(基本项部分)(2022版).doc VIP
- 实施指南《GB_T37306.1-2019金属材料疲劳试验变幅疲劳试验第1部分:总则、试验方法和报告要求》实施指南.docx VIP
- 中药生产监督管理专门规定-培训.pptx VIP
- 大学在线开放课程建设实施方案.docx VIP
- 电子病历系统应用水平四级实证材料通用模板(选择项部分)(2024版).doc VIP
- 北师大版六年级数学下册第一单元《圆柱与圆锥》课件.pptx VIP
- PEP人教版小学英语四年级下册阅读理解练习36篇.pdf VIP
- 2025年云南省中考数学——26题二次函数降次幂精选题35道.docx VIP
- 《化妆品中凝血酸(氨甲环酸)的测定 高效液相色谱法》.pdf VIP
- 厂房建设投资估算表.xls VIP
原创力文档

文档评论(0)