访问者模式定义
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式使用场景
- 对象结构比较稳定,但经常需要在此对象结构上定义新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。
访问者模式的结构与实现

/**
* 抽象访问者,为该对象结构中 ConcreteElement 的每一个类声明一个 Visitor 操作
*/
public abstract class Visitor {
public abstract void visit(ConcreteElementA element);
public abstract void visit(ConcreteElementB element);
}
/**
* 具体访问者,实现每个有 Visitor 声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类
*/
public class ConcreteVisitorA extends Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("具体访问者A访问-->" + element.operationA());
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("具体访问者A访问-->" + element.operationB());
}
}
public class ConcreteVisitorB extends Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("具体访问者B访问-->" + element.operationA());
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("具体访问者B访问-->" + element.operationB());
}
}
/**
* 抽象元素类,定义一个 accept 操作,以一个访问者为参数
*/
public abstract class Element {
public abstract void accept(Visitor visitor);
}
/**
* 具体元素,实现 accept 操作
*/
public class ConcreteElementA extends Element {
@Override
public void accept(Visitor visitor) {
// 充分利用双分派技术,实现处理与数据结构的分离
visitor.visit(this);
}
public String operationA() {
return "具体元素A的操作。";
}
}
public class ConcreteElementB extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationB() {
return "具体元素B的操作。";
}
}
/**
* 对象结构角色,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
*/
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
public void add(Element element) {
elements.add(element);
}
public void remove(Element element) {
elements.remove(element);
}
}
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(new ConcreteElementA());
objectStructure.add(new ConcreteElementB());
ConcreteVisitorA visitorA = new ConcreteVisitorA();
ConcreteVisitorB visitorB = new ConcreteVisitorB();
objectStructure.accept(visitorA);
System.out.println("------------------------");
objectStructure.accept(visitorB);
}
}
程序的运行结果如下:
具体访问者A访问-->具体元素A的操作。
具体访问者A访问-->具体元素B的操作。
------------------------
具体访问者B访问-->具体元素A的操作。
具体访问者B访问-->具体元素B的操作。
网友评论