访问者模式(Visitor Pattern)是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新的操作。属于行为型模式。
结构图
代码演示
数据结构中的元素
// 数据元素
public abstract class Element {
private String name;
public Element(String name) {
this.name = name;
}
public abstract void accept(IVisitor visitor);
}
public class ElementA extends Element {
public ElementA(String name) {
super(name);
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public void operationA() {
System.out.println("来自ElementA的操作方法!");
}
}
public class ElementB extends Element {
public ElementB(String name) {
super(name);
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public void operationB() {
System.out.println("来自ElementB的操作方法!");
}
}
访问者接口
public interface IVisitor {
void visit(ElementA element);
void visit(ElementB element);
}
public class ConcreteVisitorA implements IVisitor {
@Override
public void visit(ElementA element) {
element.operationA();
System.out.println("访问者A访问了元素A");
}
@Override
public void visit(ElementB element) {
element.operationB();
System.out.println("访问者A访问了元素B");
}
}
public class ConcreteVisitorB implements IVisitor {
@Override
public void visit(ElementA element) {
element.operationA();
System.out.println("访问者B访问了元素A");
}
@Override
public void visit(ElementB element) {
element.operationB();
System.out.println("访问者B访问了元素B");
}
}
数据结构
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
{
elements.add(new ElementA("元素A"));
elements.add(new ElementB("元素B"));
}
public void accpt(IVisitor visitor) {
elements.forEach(element -> {
element.accept(visitor);
});
}
}
测试类
public class Test {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.accpt(new ConcreteVisitorA());
objectStructure.accpt(new ConcreteVisitorB());
}
}