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. Canny边缘检测及C++实现

    Canny边缘检测算法是澳大利亚科学家John F. Canny在1986年提出来的,不得不提一下的是当年John Canny本人才28岁!到今天已经30年过去了,Canny算法仍然是图像边缘检测算法 ...

  2. centos 6.5搭建Samba

    Samba共享服务器 先将selinux关闭和防火墙端口号打开 #iptables -A INPUT -p udp -dport -j ACCEPT #iptables -A INPUT -p udp ...

  3. 巧用Linux 架设TFTP Server备份路由器的配置文件

    本文首发<网管员世界>  转载本文站点: ChinaITLAB TFTP (普通文件传输协议或一般文件传输协议) 大家一定记得在2003年8月12日全球爆发冲击波(Worm.Blaster ...

  4. ipad 基础

    一.必备技巧 1.死机重启苹果的东西都比较稳定,但这并不等于iPad不会死机.死机了怎么办?iPad电池可是内置的,后盖一般用户也打不开.方法是:按住机身顶端的电源键和圆形的HOME键几秒钟,这时iP ...

  5. ZOJ 3435 Ideal Puzzle Bobble 莫比乌斯反演

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4119 依然是三维空间内求(1,1,1)~(a,b,c)能看到的整点数,平移一下 ...

  6. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  7. Kinect 开发 —— Kinect studio

    This tool can record all the data coming into an application from a Kinect unit. You can then view, ...

  8. shutdown---系统关机

    shutdown命令用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 语法 shutdown(选项)(参数) 选项 -c:当执行“shutdown - ...

  9. python 中文文档地址总结

    sqlalchemy: https://www.imooc.com/article/details/id/22343

  10. 抓包神器Fiddler之Https请求随心转

    随着AppleStore对APP的审核越来越严格,客户端请求服务端API的方式大多数都变更为了https,在更安全的同时又引起了另外一个问题——本地抓包开发调试的不便. 一般来说,我们在开发API的时 ...