行为型模式之五:访问者模式

原创
2015/08/27 17:40
阅读数 58

访问者模式通常使用在编译器中的解析器中,像Eclipse中JDT AST PARER。 基本上,一个访问者模式中有两个接口,访问者与元素。

访问者故事

有一个初次访问者来到纽约。他想访问这个城市,城市接受他的访问,一旦他开始访问,就会自动访问所有的东西,他可能不要调用方法,当他相去博物馆,旅行是全包的!

访问者模式的类图

访问者模式的步骤

类图显示了访问的步骤

   

处理流程如下 

1,一个 FirstTimeVisitor和City元素被创建。 

2,程序开始,输出“City accept a visitor”。 

3,City中定义的接受方法让访问者开始访问。 

4,接受访问者,调用覆盖的vist去访问城市。

访问者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 {
 
  @Override
  public void visit(City city) {
    System.out.println("I'm visiting the city!");
  }
 
  @Override
  public void visit(Museum museum) {
    System.out.println("I'm visiting the Museum!");
  }
 
  @Override
  public void visit(Park park) {
    System.out.println("I'm visiting the Park!");
  }
}
 
interface Element {
  public void accept(Visitor visitor);
}
 
class City implements Element {
 
  ArrayList places = new ArrayList();
 
  public City() {
    places.add(new Museum());
    places.add(new Park());
  }
 
  @Override
  public 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 {
  @Override
  public void accept(Visitor visitor) {
    System.out.println("Museum is accepting visitor.");
    visitor.visit(this);
  }
}
 
class Park implements Element {
  @Override
  public 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!

Visitor模式在JDK中

javax.lang.model.element.AnnotationValue 显然使用了访问者模式,但是他不是常规项目使用项。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部