源自:http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html
Visitor访问者模式:
表示一个作用于某对象结构中各元素的操作。它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法。
例子:
public interface Visitor {
public void visitElementA(ConcreteElementA elementA);//针对具体元素A的新方法
public void visitElementB(ConcreteElementB elementB);//针对具体元素B的新方法
}
public interface Element {
public void accept(Visitor visitor);
}
public class ConcreteVisitor implements Visitor {
public void visitElementA(ConcreteElementA elementA) {
System.out.println(elementA.getName() + " visited by ConcreteVisitor ");
}
public void visitElementB(ConcreteElementB elementB) {
System.out.println(elementB.getName() + " visited by ConcreteVisitor ");
}
}
public class ConcreteElementA implements Element {
private String name;
public ConcreteElementA(String name) {
this.name = name;
}
public void accept(Visitor visitor) {// 接受访问者调用它针对该元素的新方法
visitor.visitElementA(this);
}
public String getName() {
return name;
}
}
public class ConcreteElementB implements Element {
private String name;
public ConcreteElementB(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void accept(Visitor visitor) {// 接受访问者调用它针对该元素的新方法
visitor.visitElementB(this);
}
}
public class ObjectStructure {
private Collection
collection = new ArrayList
();
public void attach(Element element) {
collection.add(element);
}
public void detach(Element element) {
collection.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : collection) {
element.accept(visitor);
}
}
}
public class Client {
public static void main(String args[]) {
Element elementA = new ConcreteElementA("ElementA");
Element elementB = new ConcreteElementB("ElementB");
Visitor visitor = new ConcreteVisitor();
ObjectStructure os = new ObjectStructure();
os.attach(elementA);
os.attach(elementB);
os.accept(visitor);
}
}