访问者模式(Visitor pattern)是一种行为型设计模式,它允许在不修改已有对象结构的情况下定义新操作。该模式将数据结构与操作分离,使得新增操作变得容易,并且可以在不同的数据结构上复用相同的操作。
通过将访问者对象传递给元素类,在元素类内部根据具体访问者类型调用对应方法。此方式只有一次动态绑定。
- interface Visitor {
- void visit(ElementA element);
- void visit(ElementB element);
- }
-
- class ConcreteVisitor implements Visitor {
- @Override
- public void visit(ElementA element) {
- // 对ElementA进行操作逻辑
- System.out.println("Visiting Element A");
- }
-
- @Override
- public void visit(ElementB element) {
- // 对ElementB进行操作逻辑
- System.out.println("Visiting Element B");
- }
- }
-
- abstract class Element {
- public abstract void accept(Visitor visitor);
- }
-
- class ElementA extends Element {
- @Override
- public void accept(Visitor visitor) {
- visitor.visit(this);
- }
- }
-
- class ElementB extends Element {
- @Override
- public void accept(Visitor visitor) {
- visitor.visit(this);
- }
- }
- public class Main {
-
- public static void main(String[] args) {
- Element elementA = new ElementA();
- Element elementB = new ElementB();
-
- Visitor visitor = new ConcreteVisitor();
-
- elementA.accept(visitor); // 调用ElementA的accept方法,并传入visitor对象
- elementB.accept(visitor); // 调用ElementB的accept方法,并传入visitor对象
- }
- }
存在问题:
单分派方式的实现原理相对简单,但它有一个明显的缺点:每次新增具体元素类时,都需要在访问者接口和具体访问者类中添加对应的visit方法。这样会导致具体访问者类和抽象元素类之间的耦合增加,当元素和操作数量庞大时,维护起来可能会比较困难。
另外,在单分派方式下,动态绑定只发生一次,即在调用accept方法时根据具体元素类型选择合适的visit方法。因此,在运行时无法根据不同操作类型再进行动态绑定。