1.前言
訪問者模式是23中設計模式中最複雜的一個,是一種將數據操作與數據結構分離的設計模式,幸運的是它的使用頻率並不高。
訪問者模式適合用於數據結構相對穩定的系統。
訪問者模式的優點就是增加新的操作很容易,增加新的操作意味着增加一個新的訪問者。訪問者模式將有關的行爲集中到一個訪問者對象中去了。
缺點就是使增加新的數據結構變得困難了。
2.定義
訪問者模式:表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
3.UML圖
4.訪問者模式基本代碼
/**
* Visitor類,爲該對象結構中ConcreteElement的每一個類聲明一個Visit操作
*/
public abstract class Visitor {
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
/**
* ConcreteVisitor1和ConcreteVisitor2類,具體訪問者,實現每個由Visitor聲明的操作。
* 每個操作實現算法的一部分,而該算法片斷乃是對應於結構中對象的類
*/
public class ConcreteVisitor1 extends Visitor {
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
}
}
public class ConcreteVisitor2 extends Visitor {
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
}
}
/**
* Element類,定義一個Accept操作,它以一個訪問者爲參數
*/
public abstract class Element {
public abstract void Accept(Visitor visitor);
}
/**
* ConcreteElementA和ConcreteElementB類,具體元素,實現Accept操作
*/
public class ConcreteElementA extends Element {
@Override
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementA(this);
}
/**
* 其他相關方法
*/
public void OperationA(){
}
}
public class ConcreteElementB extends Element {
@Override
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementB(this);
}
/**
* 其他相關方法
*/
public void OperationB(){
}
}
/**
* ObjectStructure類,能枚舉它的元素,可以提供一個高層的接口以允許訪問者訪問它的元素
*/
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void Attach(Element element){
elements.add(element);
}
public void Detach(Element element){
elements.remove(element);
}
public void Accept(Visitor visitor){
for (Element e : elements) {
e.Accept(visitor);
}
}
}
客戶端代碼
public class VisitorActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.Attach(new ConcreteElementA());
objectStructure.Attach(new ConcreteElementB());
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
objectStructure.Accept(v1);
objectStructure.Accept(v2);
}
}