Posted on 2007-12-15 18:37
flustar 閱讀(1241)
評論(0) 編輯 收藏 所屬分類:
Design Patterns
Visitor模式定義:
表示一個作用于某對象結(jié)構(gòu)中各元素的操作。它可以使你不修改各元素類的前提下定義作用于這些元素的新操作,也就是動態(tài)的增加新的方法。
Visitor模式結(jié)構(gòu)圖:

Visitor模式中主要角色:
1) 訪問者角色(Visitor):為該對象結(jié)構(gòu)(ObjectStructure)中的具體元素提供一個訪問操作接口。該操作接口的名字和參數(shù)標識了要訪問的具體元素角色。這樣訪問者就可以通過該元素角色的特定接口直接訪問它。
2) 具體訪問者角色(ConcreteVisitor):實現(xiàn)Vistor接口的操作。
3)元素角色(Element):該接口定義一個accept操作接受具體的訪問者。
4) 具體元素角色(ConcreteElement):實現(xiàn)Element的accept操作。
5) 對象結(jié)構(gòu)角色(ObjectStructure):這是使用訪問者模式必備的角色。它要具備以下特征:能枚舉它的元素;可以提供一個高層的接口以允許該訪問者訪問它的元素;可以是一個復(fù)合(組合模式)或是一個集合,如一個列表或一個無序集合。
Visitor模式的一個例子
由于本人閱歷不足,實在想不出好的例子,這個例子基本是按結(jié)構(gòu)圖所寫,不過已經(jīng)加上了注釋。
import java.util.ArrayList;
import java.util.Collection;
interface Visitor{
public void visitElementA(ConcreteElementA elementA);//針對具體元素A的新方法
public void visitElementB(ConcreteElementB elementB);//針對具體元素B的新方法
}
interface Element{
public void accept(Visitor visitor);
}
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 ");
}
}
class ConcreteElementA implements Element{//具體元素A
private String name;
public ConcreteElementA(String name){
this.name=name;
}
public void accept(Visitor visitor) {//接受訪問者調(diào)用它針對該元素的新方法
visitor.visitElementA(this);
}
public String getName() {
return name;
}
}
class ConcreteElementB implements Element{//具體元素B
private String name;
public ConcreteElementB(String name){
this.name=name;
}
public String getName() {
return name;
}
public void accept(Visitor visitor) {//接受訪問者調(diào)用它針對該元素的新方法
visitor.visitElementB(this);
}
}
class ObjectStructure{//對象結(jié)構(gòu)即元素的集合
private Collection<Element> collection=new ArrayList<Element>();
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);
}
}
Visitor模式優(yōu)缺點:
1) 優(yōu)點:不用修改具體的元素類,就可以增加新的操作。主要是通過元素類的accept方法來接受一個visitor對象來實現(xiàn)的。
2) 缺點:不易頻繁增加元素類,沒增加一個元素類,就要在Visitor接口中寫一個針對該元素的方法,而且還要修改Visitor的子類。