定義
封裝一些作用於某種數據結構中的各元素,它可以在不改變數據結構的前提下定義作用於這些元素的新的操作.
角色
抽象訪問者
抽象類或者接口,聲明訪問者可以訪問哪些元素
具體訪問者
實現具體該幹什麼
抽象元素
接口或者抽象類,聲明接受哪一類訪問者訪問.
具體元素
實現具體方法
結構對象
元素產生者,一般容納在容器中.
優點
- 符合單一職責原則
- 優秀的擴展性
- 靈活性非常高
缺點
- 具體元素對訪問者公佈細節
- 具體元素變更比較困難
- 違背了依賴倒置原則
通用代碼
抽象元素
public abstract class Element {
abstract void doSomething();
abstract void accept(IVisitor IVisitor);
}
具體元素
public class ConcreteElement1 extends Element {
@Override
void doSomething() {
}
@Override
void accept(IVisitor IVisitor) {
IVisitor.visit(this);
}
}
public class ConcreteElement2 extends Element {
@Override
void doSomething() {
}
@Override
void accept(IVisitor IVisitor) {
IVisitor.visit(this);
}
}
抽象訪問者
public interface IVisitor {
void visit(ConcreteElement1 concreteElement1);
void visit(ConcreteElement2 concreteElement2);
}
具體訪問者
public class Visitor implements IVisitor {
@Override
public void visit(ConcreteElement1 concreteElement1) {
concreteElement1.doSomething();
}
@Override
public void visit(ConcreteElement2 concreteElement2) {
concreteElement2.doSomething();
}
}