Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236857
  • 博文数量: 38
  • 博客积分: 710
  • 博客等级: 上士
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 10:52
文章分类

全部博文(38)

文章存档

2016年(1)

2015年(10)

2014年(1)

2013年(7)

2011年(9)

2010年(10)

我的朋友

分类: Java

2015-03-20 15:35:11

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在CODE上查看代码片派生到我的代码片
  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



阅读(1233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~