《大话设计模式》第二十八章
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的代码。