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.
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<Element> places = new ArrayList<Element>(); 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); } }
JDK中的 Visitor 模式
javax.lang.model.element.AnnotationValue 明显使用了 Visitor pattern, 但它很少被正规项目使用
本文出处:http://www.programcreek.com/2011/05/visitor-design-pattern-example/ 写得很好,故翻译之
原文:http://blog.csdn.net/span76/article/details/18363405