26-Java访问者模式 ( Visitor Pattern )
Java访问者模式
- 摘要
- 实现
- 范例
- 访问者模式(Visitor Pattern)使用了一个访问者类,它改变了元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变
- 访问者模式中,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作
模板模式属于行为型模式
摘要
1. 意图
- 主要将数据结构与数据操作分离
2. 主要解决
- 稳定的数据结构和易变的操作耦合问题。
3. 何时使用
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作”污染”这些对象的类,使用访问者模式将这些封装到类中
4. 如何解决
- 在被访问的类里面加一个对外提供接待访问者的接口
5. 关键代码
- 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者
6. 应用实例
- 您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式
7. 优点
- 符合单一职责原则;
- 优秀的扩展性;
- 灵活性;
8. 缺点
- 具体元素对访问者公布细节,违反了迪米特原则;
- 具体元素变更比较困难;
- 违反了依赖倒置原则,依赖了具体类,没有依赖抽象;
9. 使用场景
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作;
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类;
10. 注意事项
- 访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器
实现

- 创建一个定义接受操作的ComputerPart接口;
- 定义类Keyboard、Mouse、Monitor和Computer实现ComputerPart接口;
- 定义另一个接口ComputerPartVisitor,它定义了访问者类的操作;
- 定义类Computer使用实体访问者来执行相应的动作;
- 定义类VisitorPatternDemo使用Computer、ComputerPartVisitor类来演示访问者模式的用法;
范例
1. 定义一个表示元素的接口
ComputerPart.java
package com.demo.gof;
public interface ComputerPart {public void accept(ComputerPartVisitor computerPartVisitor);
}
2. 创建扩展了上述类的实体类
Keyboard.java
package com.demo.gof;
public class Keyboard implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
Monitor.java
package com.demo.gof;
public class Monitor implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
Computer.java
package com.demo.gof;
public class Computer implements ComputerPart {ComputerPart[] parts;public Computer(){parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; } @Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {for (int i = 0; i < parts.length; i++) {parts[i].accept(computerPartVisitor);}computerPartVisitor.visit(this);}
}
3. 定义一个表示访问者的接口
ComputerPartVisitor.java
package com.demo.gof;
public interface ComputerPartVisitor {public void visit(Computer computer);public void visit(Mouse mouse);public void visit(Keyboard keyboard);public void visit(Monitor monitor);
}
4. 创建实现了上述类的实体访问者
ComputerPartDisplayVisitor.java
package com.demo.gof;
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {@Overridepublic void visit(Computer computer) {System.out.println("Displaying Computer.");}@Overridepublic void visit(Mouse mouse) {System.out.println("Displaying Mouse.");}@Overridepublic void visit(Keyboard keyboard) {System.out.println("Displaying Keyboard.");}@Overridepublic void visit(Monitor monitor) {System.out.println("Displaying Monitor.");}
}
5. 使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分
VisitorPatternDemo.java
package com.demo.gof;
public class VisitorPatternDemo {public static void main(String[] args) {ComputerPart computer = new Computer();computer.accept(new ComputerPartDisplayVisitor());}
}
编译运行以上 Java 范例,输出结果如下
$ javac -d . src/main/com.demo/gof/VisitorPatternDemo.java
$ java com.ddkk.demo.VisitorPatternDemo
Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.相关文章:
26-Java访问者模式 ( Visitor Pattern )
Java访问者模式 摘要实现范例 访问者模式(Visitor Pattern)使用了一个访问者类,它改变了元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变访问者模式中,元素对象已接受访问者对象&a…...
电子科技大学链时代工作室招新题C语言部分---题号G
1. 题目 问题的第一段也是非常逆天,说实话,你编不出问题背景可以不编。 这道题的大概意思就是, Pia要去坐飞机,那么行李就有限重。这时Pia想到自己带了个硬盘,众所周知,硬盘上存储的数据就是0和1的二进制序…...
体育运动直播中的智能运动跟踪和动作识别系统 - 视频分析如何协助流媒体做出实时决策
AI-Powered Streaming Vision: Transforming Real-Time Decisions with Video Analytics 原著:弗朗西斯科冈萨雷斯|斯特朗(STRONG)公司首席ML科学家 翻译:数字化营销工兵 实时视频分析通过即时处理实时视频数据&…...
Avalon总线学习
Avalon总线学习 avalon总线可以分为: Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…...
Sentinel(熔断规则)
慢调用比例 慢调用比例( SLOM_REQUEST_RATTo ):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,…...
Hive借助java反射解决User-agent编码乱码问题
一、需求背景 在截取到浏览器user-agent,并想保存入数据库中,经查询发现展示的为编码后的结果。 现需要经过url解码过程,将解码后的结果保存进数据库,那么有几种实现方式。 二、问题解决 1、百度:url在线解码工具 …...
Linux下安装Android Studio及创建桌面快捷方式
下载 官网地址:https://developer.android.com/studio?hlzh-cn点击下载最新版本即可 安装 将下载完成后文件,进行解压,然后进入android-studio-2023.2.1.23-linux/android-studio/bin目录下,启动studio.sh即可为了更加方便的使…...
【析】一类动态车辆路径问题模型和两阶段算法
一类动态车辆路径问题模型和两阶段算法 摘要 针对一类动态车辆路径问题,分析4种主要类型动态信息对传统车辆路径问题的本质影响,将动态车辆路径问题(Dynamic Vehicle Routing Problem, DVRP)转化为多个静态的多车型开放式车辆路径问题(The Fleet Size a…...
从基础入门到学穿C++
前言知识 C简介 C是一门什么样的语言,它与C语言有着什么样的关系? C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解…...
代码随想录算法训练营第二十四天|leetcode78、90、93题
一、leetcode第93题 class Solution { public:vector<string> restoreIpAddresses(string s) {int n s.size();vector<string> res;function<void(string, int, int)> dfs [&](string ss, int idx, int t) -> void {// 终止条件,枚举完&…...
Java学习笔记NO.20
Java流程控制 1. 用户交互 Scanner Java中的Scanner类用于获取用户输入,可以从标准输入(键盘)读取各种类型的数据。 import java.util.Scanner; public class UserInputExample { public static void main(String[] args) { Scanner sc…...
关系型数据库mysql(1)基础认知和安装
目录 一.数据库的基本概念 1.1数据 1.2表 1.3数据库 1.4 DBMS 数据库管理系统 1.4.1基本功能 1.4.2优点 1.4.3DBMS的工作模式 二.数据库的发展历史 2.1发展的三个阶段 第一代数据库 第二代数据库 第三代数据库 2.2mysql发展历史 三.主流数据库 四.关系型数据库和…...
WanAndroid(鸿蒙版)开发的第三篇
前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …...
全国农产品价格分析预测可视化系统设计与实现
全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会,数据的可视化已成为决策和分析的重要工具。尤其是在农业领域,了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求,设计并实现了全国农产…...
堆排序(数据结构)
本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 1. 建堆 • 升序:建大堆 • 降序:建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…...
使用DMA方式控制串口
本身DMA没什么问题,但是最后用GPIOB点灯,就是点不亮。 回到原来GPIO点灯程序,使用GPIOB就是不亮,替换为GPIOA就可以,简单问题总是卡得很伤。...
ModbusTCP转Profinet网关高低字节交换切换
背景:在现场设备与设备通迅之间通常涉及到从一种字节序(大端或小端)转换到另一种字节序。大端字节序是指高位字节存储在高地址处,而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…...
OpenvSwitch VXLAN 隧道实验
OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络,下面基于ubuntu虚拟机安装OpenvSwitch,测试vxlan的基本配置。 节点信息: 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…...
GPT能复制人类的决策和直觉吗?
GPT-3能否复制人类的决策和直觉? 近年来,像GPT-3这样的神经网络取得了显著进步,生成的文本几乎与人类写作内容难以区分。令人惊讶的是,GPT-3在解决数学问题和编程任务方面也表现出色。这一显著进步引发了一个问题:GPT…...
权限设计种类【RBAC、ABAC】
ACL 模型:访问控制列表 DAC 模型:自主访问控制 MAC 模型:强制访问控制 ABAC 模型:基于属性的访问控制 RBAC 模型:基于角色的权限访问控制 一、简介前三种模型: 1.1 ACL(Access Control L…...
Qwen3.5-9B图文理解效果展示:JPEG/PNG上传问答真实作品
Qwen3.5-9B图文理解效果展示:JPEG/PNG上传问答真实作品 1. 惊艳的多模态理解能力 Qwen3.5-9B作为一款90亿参数的开源大语言模型,在多模态理解方面展现出了令人印象深刻的能力。特别是其变体Qwen3.5-9B-VL,能够同时处理文本和图像输入&#…...
PHP防止Shell命令注入的有效方法
最直接的方法是尽量避免在PHP代码中执行Shell命令。如果可能的话,使用PHP内置的函数来完成相同的任务。例如,使用file_get_contents()代替shell_exec(cat file.txt)来读取文件内容。2. 使用安全的函数如果确实需要执行Shell命令,尽量使用PHP提…...
告别虚拟机:在Mac/Windows本地用Docker快速拉起StarRocks测试环境
告别虚拟机:在Mac/Windows本地用Docker快速拉起StarRocks测试环境 当我们需要快速验证一个数据库的功能特性时,传统方式往往需要在虚拟机或物理机上经历繁琐的安装配置过程。对于StarRocks这样的分布式分析型数据库,传统部署方式更是需要准备…...
【Docker】RedHat 7.9 企业级环境 Docker 部署实战与避坑指南
1. 企业级环境下的Docker部署挑战 在企业生产环境中部署Docker,尤其是像RedHat 7.9这样的传统Linux发行版,会遇到不少特有的挑战。我经历过多次这样的部署过程,深知其中可能遇到的坑。不同于个人开发环境,企业级部署需要考虑稳定性…...
终极视频修复指南:如何用Untrunc免费恢复损坏的MP4、MOV视频文件
终极视频修复指南:如何用Untrunc免费恢复损坏的MP4、MOV视频文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc …...
2026.4.5
线段树+lazy标记#include<bits/stdc.h> using namespace std; #define int long long #define N 100004 int num[N],tree[4*N],n,q,ans; int len[4*N],lazy[4*N]; char op; int a1,a2,a3; void updata(int xx) {tree[xx]tree[xx*2]tree[xx*21];len[xx]len[xx*…...
SEO_从零开始构建可持续流量的SEO体系
SEO:从零开始构建可持续流量的SEO体系 在互联网时代,拥有一个高流量的网站已经不再是小事。对于初学者来说,从零开始构建一个可持续的SEO体系,听起来可能有些令人望而生畏。通过一些基本策略和长期的努力,任何人都可以实现这一目…...
从安装到实战:在快马生成项目中体验openclaw本地安装与即时数据抓取
从安装到实战:在快马生成项目中体验openclaw本地安装与即时数据抓取 最近在做一个数据采集的小项目,需要从网站上抓取一些公开信息。经过调研发现openclaw这个工具很适合我的需求,但网上关于它的本地安装和实际应用的完整教程比较少。于是我…...
面试复盘之WHERE和HAVING的区别以及MySQL的索引
where是在数据分组之前进行过滤执行流程 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY示例 SELECT * FROM employee WHERE salary > 5000;含义:先从表中筛选出 salary > 5000 的记录,再返回结果。 HAVING 关键字 HAVING 的作用…...
Cesium实战指南4-Polylines图元高级应用解析
1. Polylines图元基础概念与核心价值 在三维地理可视化领域,Polylines(折线)是最基础也最常用的图元之一。简单来说,它就是连接多个点的线段集合,但千万别小看这个基础功能——从飞机航线到河流走向,从城市…...
