Java 设计模式之访问者模式
概述
- 访问者模式(Visitor Pattern):是一种行为设计模式,它允许你将算法与对象结构分离。通过访问者模式,你可以在不修改对象结构的情况下,向对象结构中的元素添加新的操作。
- 访问者模式的核心思想是:将操作从对象结构中分离出来,封装到一个独立的访问者对象中。这样,当需要添加新的操作时,只需要创建一个新的访问者,而不需要修改现有的对象结构。
UML
- Element:元素接口,定义 accept() 方法,接收访问者对象。
- ConcreteElement:具体元素类,实现 Element 接口。
- Visitor:访问者接口,定义访问方法。
- ConcreteVisitor:具体访问者类,实现 visitor 接口。
- ObjectStructure:对象结构类,管理一组元素,并提供访问入口。
代码实现
定义元素接口:
public interface Element {
void accept(Visitor visitor);
}
定义具体元素类:
public class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationA() {
return "A";
}
}
public class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationB() {
return "B";
}
}
定义访问者接口:
public interface Visitor {
void visit(ConcreteElementA element);
void visit(ConcreteElementB element);
}
定义具体访问者类:
public class ConcreteVisitor1 implements Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("ConcreteVisitor1 访问 "+element.operationA());
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("ConcreteVisitor1 访问 "+element.operationB());
}
}
public class ConcreteVisitor2 implements Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("ConcreteVisitor2 访问 " + element.operationA());
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("ConcreteVisitor2 访问 " + element.operationB());
}
}
定义对象结构类:
public class ObjectStructure {
private ArrayList<Element> elements = new ArrayList<>();
public void addElement(Element element) {
elements.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
使用:
public class Client {
public static void main(String[] args) {
// 创建对象结构:
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.addElement(new ConcreteElementA());
objectStructure.addElement(new ConcreteElementB());
// 创建访问者:
Visitor visitor1 = new ConcreteVisitor1();
Visitor visitor2 = new ConcreteVisitor2();
// 使用访问者1访问对象结构:
System.out.println("使用访问者1");
objectStructure.accept(visitor1);
// 使用访问者2访问对象结构:
System.out.println("使用访问者2");
objectStructure.accept(visitor2);
}
}
输出:
使用访问者1
ConcreteVisitor1 访问 A
ConcreteVisitor1 访问 B
使用访问者2
ConcreteVisitor2 访问 A
ConcreteVisitor2 访问 B