Visitor(访问者)–对象行为型模式

一、意图
表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

二、动机
1.在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来繁重的变更负担,甚至破坏原有设计。
2.如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?

三、适用性
1.一个对象结构包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2.需要对一个对象结构中的对象进行很多不同的并且不想关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式上每个应用仅包含需要用到的操作。
3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

三、结构

五、效果
1.访问者模式使得易于增加新的操作。
2.访问者集中相关的操作而分离无关的操作。
3.增加新的ConcreteElement类很困难。
4.通过类层次进行访问。
5.累积状态。
6.破坏封装。

六、实现
1.双分派(Double-dispatch)。
2.谁负责遍历对象结构。

七、要点总结
1.Visitor模式通过所谓双重分发(double-dispatch)来实现在不更改(不添加新的操作-编译时),Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作(支持变化)。
2.所谓双重分发,即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态辨析;第二个为visitElementX方法的多态辨析。
3.Visitor模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致Visitor类的改变。因此Visitor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。

八、相关模式
Composit:访问者可以用于对一个由Composite模式定义的对象结构进行操作。
Interpreter:访问者可以用于解释器。

九、举例说明
不同的质检员分别抽样调查每个分厂的产品。

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

Visitor(访问者)--对象行为型模式相关推荐

  1. 设计模式-对象行为型模式

    [对象行为型模式]涉及到算法和对象间职责的分配,描述了对象和类的模式,以及它们之间的通信模式. 用来对类或对象怎样交互和怎样分配职责进行描述 1.  策略模式(strategy)           ...

  2. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)

    设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...

  3. Strategy(策略)--对象行为型模式

    Strategy(策略)–对象行为型模式 一.意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 二.动机 1.在软件构建过程中,某些对象使 ...

  4. State(状态)--对象行为型模式

    State(状态)–对象行为型模式 一.意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 二.动机 1.在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化 ...

  5. Observer(观察者)--对象行为型模式

    Observer(观察者)–对象行为型模式 一.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有的依赖于它的对象都得到通知并被自动更新. 二.动机 1.在软件构建过程中,我们需 ...

  6. Memento(备忘录)--对象行为型模式

    Memento(备忘录)–对象行为型模式 一.意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.动机 1.在软件构建过程 ...

  7. Mediator(中介者)--对象行为型模式

    Mediator(中介者)–对象行为型模式 一.意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 二.动机 1.在软 ...

  8. Command(命令)--对象行为型模式

    Command(命令)–对象行为型模式 一.意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 二.动机 1.在软件构建过程中,& ...

  9. Chain of responsibility(职责链)--对象行为型模式

    Chain of responsibility(职责链)–对象行为型模式 一.意图 使多个对象有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求, ...

最新文章

  1. 作为一名Java程序员,这些Spring知识点面试官常考
  2. 学习python需要什么基础-自学python需要什么基础,要掌握哪些知识?
  3. 4.1 什么是人脸识别-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 合并分支到master_我敢打赌!这是全网最全的 Git 分支开发规范手册
  5. 注意稳住或慢抬离合,给车辆一些缓冲,才能平顺起步。抬得太快,
  6. 如何求两个向交矩形的交集的面积?
  7. ArcGIS中生成蜂窝多边形算法解析
  8. nginx http子模块conf的初始化
  9. Java 深copy 浅copy 引用copy
  10. ios web页面测试方法
  11. kaggle实战—泰坦尼克(二、数据清洗及特征处理)
  12. 计算机网络环境中学科教学,浅谈基于计算机网络环境下的农村小学的科学学科教育...
  13. 面经——Linux内核及驱动
  14. Xcode编译后运行程序Killed: -9,因为签名有问题
  15. PyTorch YOLOV3 模型转换问题
  16. Mac怎么锁屏?苹果电脑怎么锁定屏幕
  17. java tolist_Java Collectors toList()用法及代码示例
  18. 浅谈Python爬虫(四)【英雄联盟人物背景故事爬取】
  19. 扫描枪识别条码为乱码
  20. prophet outliers异常值

热门文章

  1. 基于.NET的系统开发需要注意的问题总结
  2. C#遍历指定文件夹中的所有文件
  3. Android之判断时间戳是不是今天
  4. Android之靠谱的把图片和视频插入手机系统相册
  5. Android Studio之debug调试卡在waiting for debugger界面的解决办法
  6. Android之关于电话录音原理,目前的方法还是只能录MIC
  7. Android之项目中如何用好构建神器Gradle?
  8. 如何查看文件夹里有几张图片_如何把几张图片合成一个pdf?图片合并为pdf的操作教程...
  9. 豆瓣评分9.4分!这部大片你不应该错过,每一秒都是不敢看的残忍!
  10. 再现神人!仅仅只花4天半就解开了史上最难密码,这下整个圈子都炸开了.........