定义
封装一些作用于某种数据结构中的各元素,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.
角色
抽象访问者
抽象类或者接口,声明访问者可以访问哪些元素
具体访问者
实现具体该干什么
抽象元素
接口或者抽象类,声明接受哪一类访问者访问.
具体元素
实现具体方法
结构对象
元素产生者,一般容纳在容器中.
优点
- 符合单一职责原则
- 优秀的扩展性
- 灵活性非常高
缺点
- 具体元素对访问者公布细节
- 具体元素变更比较困难
- 违背了依赖倒置原则
通用代码
抽象元素
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();
}
}