访问者模式

访问者模式属于行为型设计模式

定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

访问者模式就是将数据结构与数据操作相分离

模式类图

角色:

  1. 抽象访问者:Visitor
  2. 具体访问者:ConcreteVisitor
  3. 抽象元素:Element
  4. 具体元素:ConcreteElement

优点

  1. 符合单一职责原则,具体元素负责数据的加载,具体访问者负责操作数据
  2. 扩展性好,如果需要新增操作方式,只需要在具体访问者增加方法,灵活性高

缺点

  1. 违背了迪米特法则,访问者类需要了解元素类的内部实现
  2. 违背了依赖倒置转原则,应该面向接口编程而不是类
  3. 元素类增加元素复杂,对应的访问者类也要根据需求看看是否需要更改

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

抽象访问者
/**
 * @author: chenmingyu
 * @date: 2019/3/26 20:52
 * @description: 抽象访问者
 */
public interface Visitorable {

    /**
     * 接收元素
     * @param sub
     */
    void visit(Element sub);
}
具体访问者
/**
 * @author: chenmingyu
 * @date: 2019/3/26 20:54
 * @description: 具体访问者
 */
public class ConcreteVisitor implements Visitorable {

    @Override
    public void visit(Element sub) {
        sub.doSomething();
        System.out.println("访问者学习设计模式");
    }
}
抽象元素
/**
 * @author: chenmingyu
 * @date: 2019/3/26 20:52
 * @description:
 */
public interface Element {

    /**
     * 接受访问者
     * @param visitor
     */
    void accept(Visitorable visitor);

    /**
     * 自定义方法
     */
    void doSomething();
}
具体元素
/**
 * @author: chenmingyu
 * @date: 2019/3/26 20:56
 * @description: 具体元素
 */
public class ConcreteElement implements Element {

    @Override
    public void accept(Visitorable visitor) {
        visitor.visit(this);
    }

    @Override
    public void doSomething() {
        System.out.println("要不要学一会儿设计模式");
    }
}
验证
public static void main(String[] args) {
    Visitorable visitor = new ConcreteVisitor();
    Element subject = new ConcreteElement();
    subject.accept(visitor);
}

输出

要不要学一会儿设计模式
访问者学习设计模式

参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193602

推荐阅读:23种设计模式详解