首页
登录 | 注册

Java Vistor 设计模式

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 代码如下


[html] view plaincopy
  1. import java.util.ArrayList;  
  2.    
  3. interface Visitor {  
  4.     public void visit(City city);  
  5.     public void visit(Museum museum);  
  6.     public void visit(Park park);  
  7. }  
  8.    
  9. class FirstTimeVisitor implements Visitor {  
  10.    
  11.     @Override  
  12.     public void visit(City city) {  
  13.         System.out.println("I'm visiting the city!");  
  14.     }  
  15.    
  16.     @Override  
  17.     public void visit(Museum museum) {  
  18.         System.out.println("I'm visiting the Museum!");  
  19.     }  
  20.    
  21.     @Override  
  22.     public void visit(Park park) {  
  23.         System.out.println("I'm visiting the Park!");  
  24.     }  
  25. }  
  26.    
  27. interface Element {  
  28.     public void accept(Visitor visitor);  
  29. }  
  30.    
  31. class City implements Element {  
  32.    
  33.     ArrayList<Element> places = new ArrayList<Element>();  
  34.    
  35.     public City() {  
  36.         places.add(new Museum());  
  37.         places.add(new Park());  
  38.     }  
  39.    
  40.     @Override  
  41.     public void accept(Visitor visitor) {  
  42.         System.out.println("City is accepting visitor.");  
  43.         visitor.visit(this);  
  44.    
  45.         for (Element e : places) {  
  46.             e.accept(visitor);  
  47.         }  
  48.     }  
  49. }  
  50.    
  51. class Museum implements Element {  
  52.     @Override  
  53.     public void accept(Visitor visitor) {  
  54.         System.out.println("Museum is accepting visitor.");  
  55.         visitor.visit(this);  
  56.     }  
  57. }  
  58.    
  59. class Park implements Element {  
  60.     @Override  
  61.     public void accept(Visitor visitor) {  
  62.         System.out.println("Park is accepting visitor.");  
  63.         visitor.visit(this);  
  64.     }  
  65.    
  66. }  
  67.    
  68. public class TestVisitor {  
  69.     public static void main(String[] args) {  
  70.         FirstTimeVisitor visitor = new FirstTimeVisitor();  
  71.         City city = new City();  
  72.         city.accept(visitor);  
  73.     }  
  74. }  



输出
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://blog.csdn.net/span76/article/details/18363405




相关文章

  • 100行代码让您学会JavaScript原生的Proxy设计模式
    面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了.比如我之前写过代理模式在Java中实现的两篇文章: Java动态代理之InvocationHandler最简单的入门教程 下面的代码创建了一个名叫Jerry的Emp ...
  • 初探Java设计模式3:行为型模式(策略,观察者等)
    行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰. 策略模式 策略模式太常用了,所以把它放到最前面进行介绍.它比较简单,我就不废话,直接用代码说事吧. 下面设计的场景是,我们需要画一个图形,可选的 ...
  • 初探Java设计模式1:创建型模式(工厂,单例等)
    一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获. 有一些重要的设计原则在开篇和大家分享下,这 ...
  • 1.修饰模式 通过增加子类的方式来扩展功能,而不是通过继承 具体的方式如下 interface inter {     void do(); } A implements inter{     public void do(){ //doS ...
  • 更多关于Java高级编程内容链接:零基础学Java10系列三:Java高级编程--阿里云大学 多线程:  生产者和消费者指的是两个不同的线程类对象,两个进程公用一个公共的固定大小缓冲区.其中之一的生产者,用于将消息传入缓冲区,另外一个是消费 ...
  • 程序员面试系列之Java单例模式的攻击与防御
    Java面试系列-webapp文件夹和WebContent文件夹的区别? Java程序员面试系列-什么是Java Marker Interface(标记接口) 编程面试题:编写一个会造成数据库死锁的应用 使用JavaScript ES6的新 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号