1.意图

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

2.别名

无

3.动机

考虑一个编译器。他将源程序表示为一个抽象语法树。该编译器须要在抽象语法上实施某些操作以进行“静态语义”分析,比如检查是否全部的变量都已经被定义了。

他也须要生成代码。由于它可能要定义很多操作以进行代码检查、代码优化、流程分析、检查变量是否在使用前被赋初值。等等。此外。还可使用抽象语法树进行优美格式打印、程序重构、code instrumentation以及对象进行多种度量。

4.适用性

下面情况使用Visitor模式:

  • 一个对象结构中包括非常多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其详细类的操作。

  • 须要对一个对象结构中的对象进行非常多不同的而且不相关的操作。而你想避免让这些操作”污染“这些对象的类。Visitor使得你能够将相关的操作集中起来定义在一个类中。当该对象结构被非常多应用共享时,用Visitor模式让每一个应用仅包括须要用到的操作。
  • 定义对象结构的类非常少改变,但常常须要在此基础上定义新的操作。改变对象结构类须要重定义对全部对象訪问者的接口,这可能须要非常大的代价。

    假设对象结构类常常改变,那么可能还是在这些类中定义这些操作比較好。

5.结构

訪问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。訪问者模式适用于数据结构相对稳定算法又易变化的系统。由于訪问者模式使得算法操作添加变得easy。若系统数据结构对象易于变化。常常有新的数据对象添加进来,则不适合使用訪问者模式。訪问者模式的长处是添加操作非常easy。由于添加操作意味着添加新的訪问者。訪问者模式将有关行为集中到一个訪问者对象中。其改变不影响系统数据结构。其缺点就是添加新的数据结构非常困难。—— From 百科

简单来说,訪问者模式就是一种分离对象数据结构与行为的方法,通过这样的分离,可达到为一个被訪问者动态加入新的操作而无需做其他的改动的效果。简单关系图:

6.代码演示样例

来看看原码:一个Visitor类。存放要訪问的对象。

实现代码:

状态结构:

public interface Visitor {
public void visit(Subject sub);
} public class MyVisitor implements Visitor { @Override
public void visit(Subject sub) {
System.out.println("visit the subject:"+sub.getSubject());
}
}

Subject类,accept方法。接受将要訪问它的对象。getSubject()获取将要被訪问的属性:

public interface Subject {
public void accept(Visitor visitor);
public String getSubject();
} public class MySubject implements Subject { @Override
public void accept(Visitor visitor) {
visitor.visit(this);
} @Override
public String getSubject() {
return "love";
}
}

測试类:

public class Test {

    public static void main(String[] args) {

        Visitor visitor = new MyVisitor();
Subject sub = new MySubject();
sub.accept(visitor);
}
}

输出:visit the subject:love

该模式适用场景:假设我们想为一个现有的类添加新功能。不得不考虑几个事情:1、新功能会不会与现有功能出现兼容性问题?2、以后会不会再须要加入?3、假设类不同意改动代码怎么办?面对这些问题,最好的解决方法就是使用訪问者模式。訪问者模式适用于数据结构相对稳定的系统,把数据结构和算法解耦。

7.相关模式

  • Composite模式:訪问者能够用于对一个由Composite模式定义的对象结构进行操作。
  • Interpreter模式:訪问者能够用于解释。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

Behavioral模式之Visitor模式的更多相关文章

  1. 访问者模式(Visitor模式)

    模式的定义与特点 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提 ...

  2. c++设计模式:访问者模式(visitor模式)

    1.c语言中回调基本都过函数指针来完成.c++中主要通过接口的方式完成回调.而visitor就是实现接口回调的一种方式. 1.首先定义个一个接口visitor类, class classVisitor ...

  3. 聊聊C#中的Visitor模式

    写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大.使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时 ...

  4. 完成C++不能做到的事 - Visitor模式

    拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩 ...

  5. 十一个行为模式之访问者模式(Visitor Pattern)

    定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...

  6. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

  7. Visitor模式,Decorator模式,Extension Object模式

    Modem结构 Visitor模式 对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法. 从派生类到方法的90度旋转. 新增类似的Windows配置函数 ...

  8. Java设计模式-访问者模式(Visitor)

    访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系统.因为访问者模式使得算法操作增加变得容易.若系统数据结构对象易于变化,经 ...

  9. 24种设计模式--访问者模式【Visitor Pattern】

    今天天气不错,绝对是晴空万里,骄阳似火呀,好,我们今天来讲访问者模式,我们在前面讲了组合模式和迭代器模式,通过组合模式我们能够把一个公司的人员组织机构树搭建起来,给管理带来非常大的便利,通过迭代器模式 ...

随机推荐

  1. docker 笔记1

    如果想要删除所有container的话再加一个指令: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker rm $(doc ...

  2. 技嘉H81M-DS2 主板安装 XP方法,及网卡驱动安装

    这是微软联合厂家封杀XP的结果,目的很简单,微软只想把你驱赶到WIN7.WIN8上去. 16.7.18 技嘉H81M-S1, G3260 安装XP系统 *BIOS 修改 Storage Boot Op ...

  3. Vue 全局过滤和局部过滤

    局部过滤器(放在组件里) filters: { //局部过滤器 FormattingMoney:value=>{ return value==null? '0' : value/100 } }, ...

  4. python垃圾回收算法

    标准python垃圾回收器由两部分组成,即引用计数回收器和分代垃圾回收器(即python包中的gc module).其中,引用计数模块不能被禁用,而GC模块可以被禁用. 引用计数算法 python中每 ...

  5. 树莓派 使用python来操作GPIO 控制LED灯

    一.创建python驱动和控制GPIO 先新建一个文件夹用于放置脚本 mkdir python_gpio 进入文件夹内新建一个gpio_blink.py的脚本 cd python_gpio touch ...

  6. 检查类型是否包含iterator

  7. 实验记录三 通用输入输出(GPIO)

    之前把全部程序都跑了一次后,得到了导师下一步的安排. 例如以下: 1.编写一个程序.实如今LCD上显示一个万年历,包含年月日 星期 还有室内的温度.2.编写一个程序,将原来的交通灯改为跑马灯. 期限是 ...

  8. es63块级作用域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 62.nodejs中的ejs模板学习

    转自:https://blog.csdn.net/dongmelon/article/details/72403913 02.ejs.这是被include的文件 <script> cons ...

  10. css选择器和优先级总结

    本文转自http://www.cnblogs.com/zxjwlh/p/6213239.html CSS三大特性—— 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式 ...