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. POJ 3184 DP+剪枝

    思路: 先找到每i头奶牛能在的位置 (一段区间) 记为L[i]和R[i] f[j]表示在位置j取到的最小值 每回在范围内更新一哈 //By SiriusRen #include <cstdio& ...

  2. codeforces 710C Magic Odd Square(构造或者n阶幻方)

    Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...

  3. Python(八) 正则表达式与JSON

    一.初识正则表达式 正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配 快速检索文本.实现替换文本的操作 json(xml) 轻量级 web 数据交换格式 impor ...

  4. 内联函数(Inline Functions)

    影响性能的一个重要因素是内联技巧.内联函数也可称为内嵌函数. 在C++中,函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时,还要进行返回值复制,恢复调用现场.这些工作都是与完成特定任务的操作 ...

  5. Bit、Byte、kb、KB、MB、KiB、MiB各表示什么意思?

    1.Byte.bit:bit表示:位,是计算机中最小的数据单位.每一位的状态只能是0或1Byte表示:字节,8个二进制位构成1个字节,即1 Byte = 8 bit .1个英文字母或者数字占用1个字节 ...

  6. 学习《概率机器人》中英文PDF+Probabilistic Robotics

    研究机器人时,使机器人能够应对环境.传感器.执行机构.内部模型.近似算法等所带来的不确定性是必须面对的问题. <概率机器人>对概率机器人学这一新兴领域进行了全面的介绍.概率机器人学依赖统计 ...

  7. ASP.NET中的几种弹出框提示

    B/S不像C/S那样一个MessageBox就可以弹出提示框,不过可以通过js的“Alert”来弹出消息,或者通过一些变种的js方法.下面我给大家介绍几种,希望大家喜欢. 四种弹出框代码: prote ...

  8. [Python] Find available methods and help in REPL

    For example you want to know what methods are available in Python for String, you can do : dir(" ...

  9. Cocos2d-x开发的Android应用怎么加入插屏广告

    Cocos2d-x系统开发游戏已经变得比較流行,但是用这个开发的游戏.想要加入广告就不是那么理想了.尤其是插屏广告.由于插屏广告通常是要在暂停或者结束游戏的时候展示才比較的合理.但是Cocos2d-x ...

  10. Template template parameter(模板參数) example

    /********************************************************************************* Copyright (C), 19 ...