1.意圖
表示一個作用於某個對象結構中的各個元素的操作。它使你可以在不改變各個元素的類的
前提下定義這些元素的新操作
2.參與者
Visitor -爲該對象結構ConcreteElement的每一個類聲明一個visit操作。
ConcreteVisitor 實現每個visitor聲明的操作
Element -定義一個Accept,它以一個訪問者爲參數
ConcreteElement - 實現Accept操作,該操作一個一個訪問者爲參數
ObjectStructure -能枚舉它的類
-可以提供一個高層的接口以允許訪問者訪問它的元素
-可以是複合對象或者一個集合
3.結構
4.代碼
public interface Element {
void accept(Visitor v);
}
public interface Visitor {
void visitor(ConcreteElementA A);
void visitor(ConcreteElementB B);
void visitor(ConcreteElementC C);
}
public class ConcreteElementA implements Element {
@Override
public void accept(Visitor v) {
v.visitor(this);
}
}
public class ConcreteElementB implements Element {
@Override
public void accept(Visitor v) {
v.visitor(this);
}
}
public class ConcreteElementC implements Element {
@Override
public void accept(Visitor v) {
v.visitor(this);
}
}
public class ConcreteVisitor implements Visitor {
@Override
public void visitor(ConcreteElementA A) {
System.out.println("ConcreteElementA");
}
@Override
public void visitor(ConcreteElementB B) {
System.out.println("ConcreteElementB");
}
@Override
public void visitor(ConcreteElementC C) {
System.out.println("ConcreteElementC");
}
}
public class Client {
public static void main(String[] args) {
List<Element> list = new ArrayList<Element>();
list.add(new ConcreteElementA());
list.add(new ConcreteElementB());
list.add(new ConcreteElementC());
Visitor v = new ConcreteVisitor();
Iterator<Element> it = list.iterator();
while(it.hasNext()){
Element e = it.next();
e.accept(v);
}
}
}