当前位置: 首页 > news >正文

设计模式之访问者模式

什么是访问者模式

    访问者模式提供了一个作用于某对象结构中的各元素的操作表示,他使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    访问者模式主要包含以下几个角色:
        Vistor(抽象访问者):为对象结构中每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型可以清楚的知道需要访问的具体元素类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。
        ConcreteVistor(具体访问者):实现了每一个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。
        Element(抽象元素):一般是抽象类或接口,定义了一个由抽象访问者作为参数的方法。
        ConcreteElement(具体元素):实现了抽象元素中的方法,在该方法中调用访问者的访问方法以完成一个元素的操作。
        ObjectStructure(对象结构):是一个元素的集合,用于存放元素对象,并且提供了遍历集合的方法。

访问者模式的优缺点

优点

  1. 增加新的访问者很方便,无需修改源代码,符合开闭原则。
  2. 将有关元素对象的访问行为集中到一个访问者中,有利于对象结构中元素对象的复用。
  3. 可以在不修改现有元素层次结构的前提下,定义作用于该层次结构的操作。

缺点

  1. 增加新的元素类很困难,每增加一个元素类都要在抽象访问者角色中增加一个新的抽象操作,并在具体访问者类中增加相应的具体操作,违背了开闭原则。
  2. 破坏了封装,访问者对象需要访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和状态。

访问者模式的应用场景

  1. 一个对象结构包含多个类型的对象,希望对这些对象的具体类型做一些操作。
  2. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作。
  3. 对象结构中对象对应的类很少改变,经常需要在对象结构中定义新的操作。

访问者模式的案例

// 抽象访问者
public abstract class Action {/*** 得到男性 的测评** @param man man*/public abstract void getManResult(Man man);/*** 得到女的 测评** @param woman woman*/public abstract void getWomanResult(Woman woman);
}// 具体访问者
public class Success extends Action {@Overridepublic void getManResult(Man man) {System.out.println(" 男人给的评价该歌手很成功 !");}@Overridepublic void getWomanResult(Woman woman) {System.out.println(" 女人给的评价该歌手很成功 !");}}public class Wait extends Action {@Overridepublic void getManResult(Man man) {System.out.println(" 男人给的评价是该歌手待定 ..");}@Overridepublic void getWomanResult(Woman woman) {System.out.println(" 女人给的评价是该歌手待定 ..");}}public class Fail extends Action {@Overridepublic void getManResult(Man man) {System.out.println(" 男人给的评价该歌手失败 !");}@Overridepublic void getWomanResult(Woman woman) {System.out.println(" 女人给的评价该歌手失败 !");}}// 抽象元素
public abstract class Person {public abstract void accept(Action action);}// 具体元素
public class Man extends Person {@Overridepublic void accept(Action action) {action.getManResult(this);}}public class Woman extends Person {@Overridepublic void accept(Action action) {action.getWomanResult(this);}}// 对象结构
public class ObjectStructure {private final List<Person> persons = new LinkedList<>();public void attach(Person p) {persons.add(p);}public void detach(Person p) {persons.remove(p);}public void display(Action action) {for (Person p : persons) {p.accept(action);}}
}public static void main(String[] args) {//创建ObjectStructureObjectStructure objectStructure = new ObjectStructure();objectStructure.attach(new Man());objectStructure.attach(new Woman());//成功Success success = new Success();objectStructure.display(success);System.out.println("===============");Fail fail = new Fail();objectStructure.display(fail);System.out.println("=======给的是待定的测评========");Wait wait = new Wait();objectStructure.display(wait);
}

在这里插入图片描述


http://www.lryc.cn/news/13124.html

相关文章:

  • Go项目(三)
  • CTK学习:(一)编译CTK
  • 15种NLP数据增强方法总结与对比
  • Python每日一练(20230219)
  • vTESTstudio - VT System CAPL Functions - VT7001
  • 「可信计算」论文初步解读
  • CSDN 算法技能树 蓝桥杯-基础 刷题+思考总结
  • 信小程序点击按钮绘制定制转发分享图
  • Python自动化测试-使用Pandas来高效处理测试数据
  • 语音增强学习路线图Roadmap
  • nginx配置ssl实现https访问
  • JavaScript 语句
  • 将古老的ASP项目转换为PHP初探
  • 数据结构复习(七)模板类封装实现不带头结点的单链表
  • IDEA插件 RestfulTool插件——Restful服务开发辅助工具集
  • 2023年全国最新会计专业技术资格精选真题及答案1
  • Linux 配置RAID组
  • 【2021/推荐/社交网络】Socially-Aware Self-Supervised Tri-Training for Recommendation
  • Django搭建个人博客Blog-Day06
  • DQL 多表查询
  • BUUCTF Reverse xor
  • vite和esbuild/roolup的优缺点
  • 32-Golang中的map
  • LeetCode-384-打乱数组
  • 九龙证券|重大利好!期货公司打新再“解绑”:可直接参与首发网下配售!
  • 信号完整性设计规则之串扰最小化
  • Windows Ubuntu双系统 设置时间同步方式
  • 【python】英雄联盟电竞观赛引擎 掉落提示 CapsuleFarmerEvolved 「Webhook」「钉钉」
  • 加油站会员管理小程序实战开发教程11
  • Python量化入门:投资的风险有哪些?