java设计模式之访问者模式

访问者模式(Visitor Pattern)

1.基本介绍

  1. 访问者模式,封装一些用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
  2. 主要讲数据结构与数据操作分离,解决数据结构和操作耦合性问题。
  3. 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。
  4. 主要应用场景是:需要对一个对象接口中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作“污染”这些对象的类,可以选用访问者模式解决。

2.原理类图

类图

  1. Visitor是抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit操作。
  2. ConcreteVisitor:是一个具体的访问值,实现每个有Visitor声明的操作,是每个操作实现的部分。
  3. ObjectStructure:能枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素。
  4. Element: 定义一个accept方法,接收一个访问者对象。
  5. ConcreteElement 为具体元素,实现了accept方法。

3.应用实例

3.1 案例

将人分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如 成功,失败 等)。

3.2 案例类图分析

类图分析

3.3 代码实现

public abstract class Action {//得到男性 的测评public abstract void getManResult(Man man);//得到女的 测评public abstract void getWomanResult(Woman woman);
}
public class Success extends Action {@Overridepublic void getManResult(Man man) {// TODO Auto-generated method stubSystem.out.println(" 男人给的评价该歌手很成功 !");}@Overridepublic void getWomanResult(Woman woman) {// TODO Auto-generated method stubSystem.out.println(" 女人给的评价该歌手很成功 !");}}
public class Fail extends Action {@Overridepublic void getManResult(Man man) {// TODO Auto-generated method stubSystem.out.println(" 男人给的评价该歌手失败 !");}@Overridepublic void getWomanResult(Woman woman) {// TODO Auto-generated method stubSystem.out.println(" 女人给的评价该歌手失败 !");}}
public class Wait extends Action {@Overridepublic void getManResult(Man man) {// TODO Auto-generated method stubSystem.out.println(" 男人给的评价是该歌手待定 ..");}@Overridepublic void getWomanResult(Woman woman) {// TODO Auto-generated method stubSystem.out.println(" 女人给的评价是该歌手待定 ..");}
}public abstract class Person {//提供一个方法,让访问者可以访问public abstract void accept(Action action);
}//说明
//1. 这里我们使用到了双分派, 即首先在客户端程序中,将具体状态作为参数传递Woman中(第一次分派)
//2. 然后Woman 类调用作为参数的 "具体方法" 中方法getWomanResult, 同时将自己(this)作为参数
//   传入,完成第二次的分派
public class Woman extends Person{@Overridepublic void accept(Action action) {// TODO Auto-generated method stubaction.getWomanResult(this);}
}
public class Man extends Person {@Overridepublic void accept(Action action) {// TODO Auto-generated method stubaction.getManResult(this);}
}
//数据结构,管理很多人(Man , Woman)
public class ObjectStructure {//维护了一个集合private List<Person> persons = new LinkedList<>();//增加到listpublic 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);}

运行结果:
结果

4. 注意事项

优点:

  1. 访问者模式符合单一职则,让程序具体优秀的扩展性、灵活性非常高。
  2. 访问者模式可以对功能进行统一,可以做报表 、UI、拦截器和过滤器,适用于数据结构相对稳定的系统。

缺点:
3. 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的,这样造成了元素变更困难。
4. 违背了依赖倒置原则,访问者依赖的是具体元素,而不是抽象元素。
5. 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/259508.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树相关OJ题

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、选择题 1、某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08; &#xff09; A.不存在这样的二叉树 B.200 C.198 D.199解析&#xff1a;选B&…

C++ 调用js 脚本

需求&#xff1a; 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的&#xff0c;但是需要引入第三方库&#xff0c;虽然也不是特别麻烦&#xff0c;但是调用js脚本&#xff0c;确实内置的功能&#xff08;C 调用lua 脚本-CSDN博客&#xff09; 步骤&#xff1a; 1&…

【人工智能】千帆平台创建和使用我的数据集,为什么需要数据集,有什么作用

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和…

《苍穹外卖》知识梳理P11-Apache POI导出报表

一.Apache POI 可以通过Apache POI处理excel文件&#xff0c;核心操作是读和写 应用场景 银行网银交易明细各种业务系统导出Excel报表批量导入业务数据 使用步骤 1.导入maven坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi&…

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java) android.os.FileUtils.sync (FileUtils.java:256) android.app.SharedPreferencesImpl.…

深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录

今天不小心将conda环境中的一个pytorch环境中的torch包给搞混了&#xff0c;将其更新了一下&#xff0c;发生了一些问题&#xff1a; 当时运行了一下这个代码&#xff1a; pip install torchvision --upgrade 导致了环境中包的混乱&#xff1a; 只能说欲哭无泪&#xff0c;当…

Nginx学习笔记

Bilibili尚硅谷视频 Nginx 简介 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 正向代理 正向代理&#xff1a;如…

蓝队应急响应工具箱v2024.1​

1 蓝队工具箱 v2024.1 2 简介 蓝队工具箱是为打造一款专业级应急响应的集成多种工具的工具集&#xff0c;由真实应急响应环境所用到的工具进行总结打包而来&#xff0c;由 ChinaRan404,W 啥都学,清辉等开发者编写.把项目现场中所用到的工具连同环境一同打包&#xff0c;并实…

如何在Windows中配置多个显示器?这里提供详细步骤

Windows可以通过多种方式使用多个显示器&#xff0c;扩展或复制主显示器。你甚至可以关闭主显示器。以下是如何使用简单的键盘快捷键更改辅助显示设置。 使用WindowsP投影菜单 要快速更改Windows 10处理多个显示器的方式&#xff0c;请按WindowsP。屏幕右侧会弹出一个名为“投…

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 图片来源&#xff1a;https://leetcode.cn/circle/discuss/UUuRex/[添加链接描述] 根据某个块块 的 左上角坐标&#xff0c;和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(mat…

使用vscode传入参数的方式进行debug

使用vscode传入参数的方式进行debug {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{&quo…

没时间,是赚钱最大谎言!

赚钱&#xff0c;应有的底线&#xff01; 成就感&#xff0c;炸了&#xff01; 如果要给失败找个理由&#xff0c;相信很多人会脱口而出&#xff0c;就是没有时间。但其实时间是最公平的&#xff0c;一天二十四小时&#xff0c;每个人都一样。 区别只是&#xff0c;你把时间用在…

《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)

文章目录 2.1 条件语句&#xff1a;决策的艺术2.1.1 基础知识讲解2.1.2 重点案例&#xff1a;用户角色权限判断实现用户角色权限判断扩展功能实现代码功能扩展&#xff1a;添加或删除用户 2.1.3 拓展案例 1&#xff1a;成绩等级判断实现成绩等级判断功能实现代码扩展功能&#…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

(14)Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

svg之全局组件,配合雪碧图解决vue2的svg优化问题

这里是vue2中的svg的完整解决方案的另一篇。 <template><svg :class"svgClass"><use :xlink:href"#${name}"></use></svg> </template><script>export default {name: icon,props: {name: {type: String,requi…

双向bfs P1032 字串变换

传送门https://www.luogu.com.cn/problem/P1032 找一个最短方案&#xff0c;考虑用bfs&#xff08;没试过单向&#xff0c;但是系数很大&#xff09; 更详细的解答 下面是代码理解&#xff08;注释版&#xff09; // Problem: // P1032 [NOIP2002 提高组] 字串变换 // …

0206-1-网络层

第 4 章 网络层 网络层提供的两种服务 虚电路服务 数据报服务 概要: 虚电路服务与数据报服务的对比 网际协议 IP 网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议&#xff1a; 地址解析协议 ARP (Address Resolution Protocol)逆地…

svg图片构造QGraphicsSvgItem对象耗时很长的问题解决

目录 1. 问题的提出 2. 问题解决 1. 问题的提出 今天通过一张像素为141 * 214&#xff0c;大小为426KB的svg格式的图片构造QGraphicsSvgItem对象&#xff0c;再通过Qt的Graphics View Framework框架&#xff0c;将QGraphicsSvgItem对象显示到场景视图上&#xff0c;代码如下&…

windows安装Mysql解压版

windows安装Mysql解压版 一、下载mysql-8.0.36-winx64.zip二、解压三、配置3.1. 添加环境变量&#xff1a;新建MYSQL_HOME3.2.如何验证是否添加成功&#xff1a;必须以管理员身份启动3.3. 初始化MySQL&#xff1a;必须以管理员身份启动3.4. 注册MySQL服务&#xff1a;必须以管理…