设计模式之访问者模式

2023-11-20

访问者模式:把被操作的对象作为元素,可变可拓展的操作作为访问者。
可以说访问者中有很多操作,然后访问者访问元素,对该元素进行操作,不同的访问者有不同的操作。

案例

在这里插入图片描述
定义访问者接口

public interface UniversalVisitor {
    void visitorMan(Man man);
    void visitorWoMan(WoMan woMan);
}

定义元素接口

public interface Person {
    void accept(UniversalVisitor universalVisitor);
}

元素具体实现类,包括男人和女人

public class Man implements Person {
    @Override
    public void accept(UniversalVisitor universalVisitor) {
        universalVisitor.visitorMan(this);
    }
}

public class WoMan implements Person {
    @Override
    public void accept(UniversalVisitor universalVisitor) {
        universalVisitor.visitorWoMan(this);
    }
}

访问者具体实现类,目前有开心和哭,当然也可以定义其他的比如说囧、丧等

public class HappyVisitor implements  UniversalVisitor{
    @Override
    public void visitorMan(Man man) {
        System.out.println("男人开心");
    }
    @Override
    public void visitorWoMan(WoMan woMan) {
        System.out.println("女人开心");
    }
}

public class CryVisitor implements  UniversalVisitor{
    @Override
    public void visitorMan(Man man) {
        System.out.println("男人哭");
    }

    @Override
    public void visitorWoMan(WoMan woMan) {
        System.out.println("女人哭");
    }
}

通过结构对象把元素进行集中、然后统一进行访问

public class ObjectStructure {

    private List<Person> elements = new ArrayList<>();

    //增加
    public void attach(Person person) {
        elements.add(person);
    }

    //移除
    public void detach(Person person) {
        elements.remove(person);
    }

    //查看显示
    public void display(UniversalVisitor universalVisitor) {
        for (Person person : elements) {
            person.accept(universalVisitor);
        }
    }

}

客户端

public class Client {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();

        objectStructure.attach(new Man());
        objectStructure.attach(new WoMan());


        HappyVisitor happyVisitor = new HappyVisitor();
        objectStructure.display(happyVisitor);

        CryVisitor cryVisitor = new CryVisitor();
        objectStructure.display(cryVisitor);
    }
}

输出结果

男人开心
女人开心
男人哭
女人哭

结论
对于元素而言,不同的访问者就能进行不同的操作,我们只需要增加不同的访问者就可以了。

优缺点

优点

符合单一职责原则
优秀的扩展性
灵活性非常高

缺点

具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的
具体元素变更比较困难
违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素

源码分析

在 Spring IoC 中,BeanDefinition 用来存储 Spring Bean 的定义信息,比如属性值、构造方法参数或者更具体的实现。Spring 解析完配置后,会生成 BeanDefinition 并且记录下来。下次 getBean 获取 Bean 时,会通过 BeanDefinition 来实例化具体的 Bean 对象。

BeanDefinition 是一个接口,即一个抽象的定义,实际使用的是其实现类,如 ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition 等。

Spring 中的 BeanDefinitionVisitor 类主要用于访问 BeanDefinition,解析属性或者构造方法里面的占位符,并把解析结果更新到 BeanDefinition 中。这里应用的就是访问者模式。抽象元素为 BeanDefinition,具体元素有 RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition 等。

因为没有对访问者进行扩展,所以这里只有一个具体访问者 BeanDefinitionVisitor,没有再抽出一层抽象访问者。
在这里插入图片描述
在这里插入图片描述
参考博客http://c.biancheng.net/view/8502.html
https://blog.csdn.net/qq_36970993/article/details/112760013?utm_term=JDK%E6%BA%90%E7%A0%81%20%E8%AE%BF%E9%97%AE%E8%80%85%E6%A8%A1%E5%BC%8F&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-1-112760013&spm=3001.4430

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之访问者模式 的相关文章

  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • 设计模式的 C++ 实现---原型模式

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 工厂方法模式 二 抽象工厂模式 一 抽象工厂模式 二 前言 原型模式指直接用一个已经存在的对象来创建一个新的对象 然后对新对象进行稍微修改即可 类似复制的操作
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 Java实际应用举例 以ASM技术为例 4 1 被访问对象 ClassReader 4 2 Visitor ClassVisitor 4 3 具体visitor
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • 行为型模式-状态模式

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • 系列一、 单例设计模式

    一 单例设计模式 1 1 概述 单例模式 Singleton Pattern 是Java中最简单的设计模式之一 这种类型的设计模式属于创建者模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并

随机推荐

  • 深度学习之学习路线

    本文知识来源参考网络与专业书籍 文章目录 一 先简单认识什么是深度学习 二 深度学习之学习路线推荐 1 学习基础 2 学习书籍与视频推荐 一 先简单认识什么是深度学习 直接看图 深度学习是属于人工智能 再细分下来就是深度学习是一种比较火的机
  • Scala安装教程

    1 Scala官网滑到最下面如图 选择Allversions 2 我们将下载2 12 16版本 如图下 3 选scala 2 12 16 zip安装 4 先将scala 2 12 16zip解压为文件夹我解压到了D盘的scalal文件夹下面
  • 计算机网络物理层概述

    物理层 一 物理层基本概念 用于物理层协议常被称为物理层规程 物理层有四个特性 1 机械特性 指明接口所用接线器的形状和尺寸 引脚数目和排列 固定和锁定装置等 平时常见的各种规格的插件都有严格的标准化规定 2 电器特性 指明在接口电缆的各条
  • OpenSSL生成密钥对

    OpenSSL工具安装 Linux用户 以Ubuntu为例 sudo apt get install openssl Windows用户 开发者可以在OpenSSL官方网站下载Windows的 OpenSSL安装包 进行安装 RSA私钥及公
  • 泰勒公式的介绍、应用及常见题型

    目录 一 简介 1 泰勒公式及其证明过程 2 两种类型的余项 3 麦克劳林公式 二 泰勒公式常见题型 1 用泰勒公式展开函数 2 用泰勒公式求极限 3 用泰勒公式讨论无穷小的比较 4 用泰勒公式证明等式和不等式 一 简介 1 泰勒公式及其证
  • JAVA实现简易HTTP服务器

    说实话 之前完全没有想过 我还能写出服务器 感觉服务器这么高端的东西 能会用就不错了 还能写 不吐槽了 开始了 这次的作业是搭建一个服务器 要能接收请求 并给浏览器返回正确响应 项目的下载地址 项目目标 实现一个简易的多线程服务器 可以处理
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • macOS命令行终端隐藏主机名和用户名

    首先要区分自己的终端用的是Bash Shell还是Zsh Shell 网上很多教程都是Bash的 所以如果你用的是Zsh 那按照Bash的步骤来设置是不会有效果的 从2019年起 macOS的默认Shell由Bash改为Zsh 查看当前使用
  • 手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)

    简介 首先声明此篇文章主要是针对测试菜鸟或者刚刚入门的小伙们或者童鞋们 大佬就没有必要往下看了 写这篇文章的由来是因为后边要用这个工具 但是由于某些原因有部分小伙伴和童鞋们可能不会安装此工具 为了方便小伙伴们和童鞋们的后续学习和不打击他们的
  • GET报错注入(Sqli-labs第一题详解)

    文章目录 一 找注入点 二 order by判断列数 三 union联合注入 判断数据显示点 四 爆库 爆表 一 找注入点 单引号注入题目 在参数后面加一个单引号 id 1 数据库报错 单引号匹配出错 即添加的单引号成功被数据库解析 可以通
  • es文件浏览器怎么开ftp服务器,es文件浏览器怎么开ftp服务器

    es文件浏览器怎么开ftp服务器 内容精选 换一换 怎样上传文件到Windows操作系统云服务器 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务
  • qt在打包的时候提示应用程序无法正常启动(0xc000007b)

    造成这种现象的原因是你的电脑中有多个版本的qt 导致环境路径会出现有问题 解决的方法是 1 找到你配置好的开发程序使用的QT版本 进入Qt命令行工具 使用windeployqt命令来进行打包
  • Mac 安装 vue 环境

    安装 nodejs 首先 安装 nodejs 官网下载node https nodejs org zh cn 接下来 安装下载下来的软件包 安装完成后 在终端输入 node v 查看是否安装成功 安装 cnpm 终端输入 sudo npm
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Linux下面安装MySQL详细步骤讲解

    今天下午在Linux下装了MySQL 我的是虚拟机里面装的CentOs7版本 装mysql的过程中遇到了一些问题 网上的回答又是乱七八糟 为了使朋友们少走弯路 特把我今天安装的全部流程总结如下 1 首先我是先从官网下下载一个 mysql 5
  • 在centos在部署分布式文件存储系统Minio

    docker部署以及详细文档自取 链接 https pan baidu com s 14NhCk1SQZEHqzMubpUD0eQ 提取码 xyxy 0 应用场景 电商网站 海量商品图片 视频网站 海量视频文件 网盘 海量文件 社交网站 海
  • LeetCode题解—260.只出现一次的数字Ⅲ

    题目地址 260 只出现一次的数字 III 力扣 LeetCode 题解 这道题是基于寻找只出现一次的数字 上的拓展 136 只出现一次的数字 力扣 LeetCode 在 中 我们只需要把所有的数字异或一遍即可 因为只有一个数字是唯一的 但
  • 2.23怎么在OrCAD原理图中显示与隐藏元器件的Value值?【OrCAD原理图封装库50问解析】

    笔者电子信息专业硕士毕业 获得过多次电子设计大赛 大学生智能车 数学建模国奖 现就职于南京某半导体芯片公司 从事硬件研发 电路设计研究 对于学电子的小伙伴 深知入门的不易 特开次博客交流分享经验 共同互勉 全套资料领取扫描文末二维码 温馨提
  • C1认证学习笔记(第三章)

    C1认证 三 JS基础 JavaScript变量命名规则 任务目标 任务背景 语法层面 工程层面 任务练习 逻辑运算 任务目标 任务背景 比较运算符 逻辑运算符 知识拓展 任务练习 隐式类型转换 任务目标 任务背景 任务内容 字符串和数字的
  • 设计模式之访问者模式

    访问者模式 把被操作的对象作为元素 可变可拓展的操作作为访问者 可以说访问者中有很多操作 然后访问者访问元素 对该元素进行操作 不同的访问者有不同的操作 案例 定义访问者接口 public interface UniversalVisito