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. js数组去重的常用方法总结

    最近几天朋友面试了几家,笔试题都做了关于数组去重的问题,自己在网上收集整理了一些去重的方法来学习下,感觉换不错哈!!!第一种方法: function oSort(arr){ var n = []; / ...

  2. Sqoop1与Sqoop2的比较

    1.sqoop1和sqoop2是两个不同的版本,它们是完全不兼容的. 2.版本划分方式:Apache 1.4.x 之后的版本属于sqoop1,1.99.x之上的版本属于sqoop2. 3.与sqoop ...

  3. css3 实现动画效果

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

  4. 使用Excel VBA(快捷键)(加菜单)

    将excel宏安全性调到中: 按alt+f11进入vba编辑器: 记住以下快捷键: F7 代码窗口 F4 属性窗口 ctrl+R 工程资源窗口 F5 程序运行 TAb 代码缩进 SHIFT+TAB  ...

  5. Supervisor 的安装与配置教程

    简介 Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd, daemo ...

  6. linux下,yum 安装mysql

    顺手记录一下安装mysqlclient 先安装mysql-devel yum install mysql-devel 再安装mysqlclient pip3 install mysqlclient 开 ...

  7. Introducing ASLR for FreeBSD

    Shawn WebbOliver Pinter10 July 2014http://www.hardenedbsd.org/ [ 1. Introduction ]Security in FreeBS ...

  8. ArcGIS Engine能够做什么?

    转自原文ArcGIS Engine能够做什么? ArcGIS Engine是一组跨平台的嵌入式ArcObjects,它是ArcGIS软件产品的底层组件,用来构建定制的GIS和桌面制图应用程序,或是向原 ...

  9. 51.cgi网站后门

    运行截图: html开发: <html> <body> <form id="form" name="form" method=&q ...

  10. LAMP环境搭建成功后的部分相关配置

    LAMP环境搭建成功后,通常还需要做一些其他配置来完善,本文主要记录常用到的一些设置. 所有的配置是基于Ubuntu 16.04 + Apache2.4 + Mysql5.7 + Php7.0,对于其 ...