概述:对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同
角色:
Visitor 为该对象结构中ConcreteElement的每一个类声明一个Visit操作。 该操作的名字和特征标识了发送Visit请求给该访问者的那个类。 这使得访问者可以确定正被访问元素的具体的类。 这样访问者就可以通过该元素的特定接口直接访问它ConcreteVisitor 实现每个由Visitor声明的操作。 每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。 ConcreteVisitor为该算法提供了上下文并存储它的局部状态。 这一状态常常在遍历该结构的过程中累积结果Element 定义一个Accept操作,它以一个访问者为参数ConcreteElement 实现Accept操作,该操作以一个访问者为参数ObjectStructure 能枚举它的元素。 可以提供一个高层的接口以允许该访问者访问它的元素。可以是一个复合或是一个集合,如一个列表或一个无序集合类图:
实现: 访问者接口:
public interface Visitor { public void visit(ElementA elementA); public void visit(ElementB elementB); }访问者实现:
public class VisitorA implements Visitor { public void visit(ElementA elementA) { System.out.println("VisitorA"); elementA.method2(); } public void visit(ElementB elementB) { System.out.println("VisitorA"); elementB.method2(); } } public class VisitorB implements Visitor { public void visit(ElementA elementA) { System.out.println("VisitorB"); elementA.method2(); } public void visit(ElementB elementB) { System.out.println("VisitorB"); elementB.method2(); } }被访问者接口:
interface Element { public void method1(Visitor visitor); public void method2(); }被访问者实现:
public class ElementA implements Element { public void method1(Visitor visitor) { visitor.visit(this); } public void method2() { System.out.println("ElementA visited"); } } public class ElementB implements Element { public void method1(Visitor visitor) { visitor.visit(this); } public void method2() { System.out.println("ElementB visited"); } }操作:
public class Context { List<Element> elementList = new ArrayList<Element>(); public void add(Element element) { elementList.add(element); } public void visit(Visitor visitor) { for(Element element : elementList){ element.method1(visitor); } } }测试:
public class testVisotor { private static Context ctx = new Context(); public static void main(String[] args) { ctx.add(new ElementA()); ctx.add(new ElementB()); ctx.add(new ElementA()); ctx.add(new ElementB()); ctx.visit(new VisitorA()); ctx.visit(new VisitorB()); } }打印: VisitorA ElementA visited VisitorA ElementB visited VisitorA ElementA visited VisitorA ElementB visited VisitorB ElementA visited VisitorB ElementB visited VisitorB ElementA visited VisitorB ElementB visited