<<设计模式之禅(第二版)>>——第二十五章 访问者模式

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


    访问者模式的通用类图
/*
 * 抽象元素,声明接受哪一类访问者访问,程序上是通过accept方法   中的参数来定义的
 * */
public abstract class Element {
  public abstract void doSomething();

  // 允许哪个访问者访问
  public abstract void accept(IVisitor visitor);
}
public class ConcreteElementOne extends Element {
  @Override
  public void doSomething() {
    // TODO Auto-generated method stub
  }

  @Override
  public void accept(IVisitor visitor) {
    // TODO Auto-generated method stub
    visitor.visit(this);
  }
}

public class ConcreteElementTwo extends Element {
  @Override
  public void doSomething() {
    // TODO Auto-generated method stub
  }

  @Override
  public void accept(IVisitor visitor) {
    // TODO Auto-generated method stub
    visitor.visit(this);
  }
}
public interface IVisitor {
  // 抽象的访问者,定义可以访问哪些对象
  public void visit(ConcreteElementOne concreteElementOne);

  public void visit(ConcreteElementTwo concreteElementTwo);
}

public class Visitor implements IVisitor {
  // 定义具体的访问者,访问对应的元素
  @Override
  public void visit(ConcreteElementOne concreteElementOne) {
    // TODO Auto-generated method stub
    concreteElementOne.doSomething();
  }

  @Override
  public void visit(ConcreteElementTwo concreteElementTwo) {
    // TODO Auto-generated method stub
    concreteElementTwo.doSomething();
  }

}
/*
 * 定义结构对象,产生不同的元素对象
 * */
public class ObjectStruture {
  public static Element createElement() {
    Random rand = new Random();
    if (rand.nextInt(100) > 50) {
        return new ConcreteElementOne();
    } else {
        return new ConcreteElementTwo();
    }
  }
}
public class Client {
  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
        // 获取元素对象
        Element element = ObjectStruture.createElement();
        // 接受访问者访问
        element.accept(new Visitor());
    }
  }
}
优点:
  • 符合单一职责原则:具体角色有Element抽象类的两个子类进行数据的加载,而Visitor类则负责报表的呈现,两个不同的职责明确地分离开,各自演绎。
  • 优秀的拓展性:增加数据的不同表现形式只需要增加一个visitor即可
  • 灵活性非常高:通过不同的visitor可以展示出不同的数据形式
缺点:
  • 具体元素对访问者公布细节
  • 具体元素变更比较困难
  • 违背了依赖倒置原则,访问者依赖的是具体的元素,而不是抽象的元素,拓展较难
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 扩展客户管理的功能## 考虑这样一个应用:扩展客户管理的功能。 既然是扩展功能,那么肯定是...
    七寸知架构阅读 8,014评论 1 58
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,389评论 1 15
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 9,346评论 3 14
  • 访问者模式是一种将数据操作与数据结构分离的设计模式。确实是我目前为止见过的最复杂的了。 博客地址 访问者模式的思想...
    喵了个呜s阅读 3,359评论 0 0
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 4,119评论 0 1