《大话设计模式》第二十八章
package ch28; public abstract class Element { public abstract void accept(Visitor visitor); }
package ch28; public abstract class Visitor { public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); }
package ch28; public class ConcreteElementA extends Element { @Override public void accept(Visitor visitor) { visitor.visitConcreteElementA(this); } }
package ch28; public class ConcreteElementB extends Element { @Override public void accept(Visitor visitor) { visitor.visitConcreteElementB(this); } }
package ch28; public class ConcreteVisitor1 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println("ConcreteVisitor1访问concreteElementA"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println("ConcreteVisitor1访问concreteElementB"); } }
package ch28; public class ConcreteVisitor2 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println("ConcreteVisitor2访问concreteElementA"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println("ConcreteVisitor2访问concreteElementB"); } }
package ch28; import java.util.LinkedList; import java.util.List; public class ObjectStructure { private List<Element> elements = new LinkedList<Element>(); public void attach(Element element) { elements.add(element); } public void detach(Element element) { elements.remove(element); } public void accept(Visitor visitor) { for (int i = 0; i < elements.size(); i++) { elements.get(i).accept(visitor); } } }
package ch28; /** * 访问者模式 * @author Administrator * */ public class Client { /** * @param args */ public static void main(String[] args) { ObjectStructure o = new ObjectStructure(); o.attach(new ConcreteElementA()); o.attach(new ConcreteElementB()); ConcreteVisitor1 v1 = new ConcreteVisitor1(); ConcreteVisitor2 v2 = new ConcreteVisitor2(); o.accept(v1); o.accept(v2); } }
运行:
ConcreteVisitor1访问concreteElementA ConcreteVisitor1访问concreteElementB ConcreteVisitor2访问concreteElementA ConcreteVisitor2访问concreteElementB
JDK中的javax.lang.model.element.ElementVisitor和Element是经典例子。但是,感觉很少用到,可能是难以理解的缘故吧。
访问者模式要求element比较稳定,不会出现新的element,那么出现新的visitor,就只要增加新的访问代码,不需要修改element的代码。
或者visitor比较稳定,不会出现新的visitor,那么出现新的element,就只要增加新的element被访问的代码,不需要修改visitor的代码。