Visitor pattern 经常被 compiler 的 parser 使用,比如 Eclipse JDT AST Parser.

它基本包含两个重要的接口, Visitor 和 Element

Visitor 模式举例

设想一个旅游者首次访问 New York, 而New York也接受它的访问。一旦访问开始,将自动访问New York的景点,他不需要调用访问 museum 的函数,此方式是整个一套打包。

Visitor 模式类图

Visitor 模式的步骤

工作流程如下:

1. visitor FirstTimeVisitor 和元素 City 被建立

2. 程序以 “City accept a visitor”.为开始
3. City 定义的accept 方法接受 visitor 去访问.
4. 被接受的 visitor 用他定义的重载(overloaded)方法“visit” 来访问 City.

Java 代码如下

import java.util.ArrayList;interface Visitor {public void visit(City city);public void visit(Museum museum);public void visit(Park park);
}class FirstTimeVisitor implements Visitor {@Overridepublic void visit(City city) {System.out.println("I'm visiting the city!");}@Overridepublic void visit(Museum museum) {System.out.println("I'm visiting the Museum!");}@Overridepublic void visit(Park park) {System.out.println("I'm visiting the Park!");}
}interface Element {public void accept(Visitor visitor);
}class City implements Element {ArrayList<Element> places = new ArrayList<Element>();public City() {places.add(new Museum());places.add(new Park());}@Overridepublic void accept(Visitor visitor) {System.out.println("City is accepting visitor.");visitor.visit(this);for (Element e : places) {e.accept(visitor);}}
}class Museum implements Element {@Overridepublic void accept(Visitor visitor) {System.out.println("Museum is accepting visitor.");visitor.visit(this);}
}class Park implements Element {@Overridepublic void accept(Visitor visitor) {System.out.println("Park is accepting visitor.");visitor.visit(this);}}public class TestVisitor {public static void main(String[] args) {FirstTimeVisitor visitor = new FirstTimeVisitor();City city = new City();city.accept(visitor);}
}

输出
City is accepting visitor.
I’m visiting the city!
Museum is accepting visitor.
I’m visiting the Museum!
Park is accepting visitor.
I’m visiting the Park!

JDK中的 Visitor 模式

javax.lang.model.element.AnnotationValue明显使用了 Visitor pattern, 但它很少被正规项目使用

本文出处: http://www.programcreek.com/2011/05/visitor-design-pattern-example/写得很好,故翻译之

Java Vistor 设计模式相关推荐

  1. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  2. java策略设计模式_Java中的策略设计模式

    java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...

  3. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  4. java 模板方法设计模式_Java中的模板方法设计模式

    java 模板方法设计模式 模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类. 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的. 让我们 ...

  5. java 生成器 设计模式_Java中的生成器设计模式

    java 生成器 设计模式 Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解 ...

  6. java设计模式之道文字版,Java Web设计模式之道 PDF

    资源名称:Java Web设计模式之道 PDF 第一部分 仙人指路--设计模式简介 第1章 设计模式概述 1.1 设计模式是什么 1.2 软件设计模式的发展历程 1.3 作者阐述软件设计模式的主要方式 ...

  7. Java代理设计模式(Proxy)的具体实现:静态代理和动态代理

    Java代理设计模式(Proxy)的具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Java ...

  8. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  9. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

最新文章

  1. ionic4中使用Swiper触屏滑动--技术
  2. TortoiseGit:记住用户名和密码
  3. 找出数组中两个只出现一次的数字
  4. QT的QDomDocument类的使用
  5. Spring Boot 整合 Shiro
  6. Python 装饰器详解(下)
  7. cocos2d-x帧动画实现(续)
  8. ajaxFileUpload+struts2多文件上传(动态添加文件上传框)
  9. 区块链软件公司:你的区块链交易真的是匿名吗?
  10. Netty websocket 推送数据压缩以 js解压
  11. [转载整理]计算机视觉及机器学习牛人和资料
  12. 斐讯M1,nodered打包显示在homekit
  13. 高德地图大头针功能_有关于高德地图的大头针下落动画。还有就是高德地图的设置...
  14. Leetcode 1146
  15. 如何实现有效的项目进度控制?
  16. 基于PHP+MySQL长途客用汽车票订票系统的设计与实现
  17. 【干货】好看小视频去水印软件使用介绍
  18. APP支持文件共享设置(iOS)
  19. 计算机一级里面有ppt,计算机一级.ppt
  20. Redis 性能测试

热门文章

  1. 程序员漫画:影响程序员一生的书单
  2. hdu 1693 Eat the Trees 插头dp
  3. oracle 分区表进行shrink操作
  4. GeoServer注意点
  5. vue实践06-项目实践
  6. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
  7. 解决树莓派的gpio口不能读取ds18b20的设备文件
  8. NSURLCache详解和使用
  9. maven 项目 missing jdk.tools.jar
  10. eclipse 中设置注释模板