模式介绍

访问者模式是一种行为型设计模式,它允许你将算法与对象结构分离。访问者模式使你可以在不修改现有类的情况下定义作用于这些类的新操作。

使用场景

  • 当对象结构包含很多类型的对象,并且希望对这些对象实施一些依赖于其具体类型的操作时
  • 当需要对一个对象结构中的对象进行很多不同且不相关的操作时
  • 当对象结构很少改变,但经常需要在此结构上定义新的操作时

代码示例

// 访问者接口
public interface Visitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}

// 元素接口
public interface Element {
    void accept(Visitor visitor);
}

// 具体元素A
public class ConcreteElementA implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void operationA() {
        System.out.println("ConcreteElementA operation");
    }
}

// 具体元素B
public class ConcreteElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void operationB() {
        System.out.println("ConcreteElementB operation");
    }
}

// 具体访问者
public class ConcreteVisitor implements Visitor {
    @Override
    public void visit(ConcreteElementA element) {
        element.operationA();
    }

    @Override
    public void visit(ConcreteElementB element) {
        element.operationB();
    }
}

优缺点

优点

  • 易于添加新的操作
  • 将相关操作集中到一个访问者对象中
  • 不改变元素类

缺点

  • 增加新的元素类很困难
  • 可能破坏封装
  • 具体元素对访问者公布细节