Java设计模式之访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许在不修改现有对象结构的情况下定义新的操作。该模式将操作封装在一个访问者对象中,使得可以在不改变被访问对象的类的前提下,通过访问者对象对被访问对象进行新的操作。
访问者模式的核心思想是将数据结构与对数据的操作分离。它通过在被访问对象的接受方法中接受一个访问者对象,并将自身作为参数传递给访问者对象的访问方法,从而实现对被访问对象的操作。
访问者模式由以下几个角色组成:
- 访问者(Visitor):定义了对每个具体元素(被访问对象)的访问操作,可以通过重载访问方法来定义不同的操作。
- 具体访问者(ConcreteVisitor):实现了访问者接口,对具体元素进行具体的操作。
- 元素(Element):定义了一个接受访问者对象的接口,通常包含一个接受方法(accept),该方法将访问者对象作为参数传递给具体元素的访问方法。
- 具体元素(ConcreteElement):实现了元素接口,提供了接受访问者对象的具体实现。
- 对象结构(Object Structure):包含元素的集合,可以是一个集合、一个列表或其他数据结构。通常提供一个迭代器用于遍历元素,并在遍历过程中调用元素的接受方法。
下面是一个简单的示例,演示了访问者模式的使用:
// 访问者接口
interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}// 具体访问者A
class ConcreteVisitorA implements Visitor {@Overridevoid visit(ConcreteElementA element) {// 对具体元素A的操作}@Overridevoid visit(ConcreteElementB element) {// 对具体元素B的操作}
}// 具体访问者B
class ConcreteVisitorB implements Visitor {@Overridevoid visit(ConcreteElementA element) {// 对具体元素A的操作}@Overridevoid visit(ConcreteElementB element) {// 对具体元素B的操作}
}// 元素接口
interface Element {void accept(Visitor visitor);
}// 具体元素A
class ConcreteElementA implements Element {@Overridevoid accept(Visitor visitor) {visitor.visit(this);}
}// 具体元素B
class ConcreteElementB implements Element {@Overridevoid accept(Visitor visitor) {visitor.visit(this);}
}// 对象结构
class ObjectStructure {private List<Element> elements = new ArrayList<>();void addElement(Element element) {elements.add(element);}void removeElement(Element element) {elements.remove(element);}void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 示例代码
public class Main {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.addElement(new ConcreteElementA());objectStructure.addElement(new ConcreteElementB());Visitor visitorA = new ConcreteVisitorA();Visitor visitorB = new ConcreteVisitorB();objectStructure.accept(visitorA);objectStructure.accept(visitorB);}
}
在上面的示例中,访问者模式允许我们定义不同的访问者(ConcreteVisitorA和ConcreteVisitorB),并对具体元素A和具体元素B进行不同的操作。通过访问者对象的访问方法,我们可以在不修改元素类的情况下,对元素进行新的操作。对象结构类(ObjectStructure)提供了对元素的管理和遍历,将访问者对象传递给元素的接受方法,从而实现对元素的操作。
相关文章:
Java设计模式之访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许在不修改现有对象结构的情况下定义新的操作。该模式将操作封装在一个访问者对象中,使得可以在不改变被访问对象的类的前提下,通过访问者对象对被访问对象进行新…...
others-AppLovin广告接入
title: others-AppLovin广告接入 categories: Others tags: [广告, AppLovin] date: 2023-10-20 10:07:01 comments: false mathjax: true toc: true others-AppLovin广告接入 前篇 官方 - https://www.applovin.com/ Android sdk - https://github.com/AppLovin/AppLovin-MAX…...
ESP32集成开发环境Espressif-IDE安装 – Windows
陈拓 2023/10/15-2023/10/16 1. 概述 Espressif IDE是一个基于Eclipse CDT的集成开发环境(IDE),用于使用ESP-IDF框架开发物联网应用程序。这是一个专门为ESP-IDF构建的独立定制IDE。Espressif IDE附带了IDF Eclipse插件、重要的Eclipse CDT插…...
python之if else语句介绍
python之if else语句介绍 在Python中,if和else是两种重要的控制流语句,它们用于根据特定的条件来执行不同的代码块。以下是它们的用法和详细介绍: 1)if语句 if语句用于在满足某种条件时执行特定的代码块。它的基本语法如下&#…...
Java版ORM最初雏形
经过一个晚上的加班,终于把ORM初步结构工程搭好了。工程依赖有点难用,编辑器提示比VS差很多。 首先LIS.Core创建一个最初的容器雏形,先能反射得到对象给ORM获得数据库驱动 然后ORM创建数据库驱动差异接口,不同数据库实现接口后配…...
黎曼几何与切空间之间的投影
公式: 从黎曼空间投影到切空间,其中P为黎曼均值,也是切空间的参考中心点,Pi是要投影到切空间的点。 从切空间投影回来,其中Si为切空间中的向量。 function Tcov CovToTan(cov,Mcov)Cm12 Mcov^(-1/2);X_new logm(Cm…...
【Tomcat】为Tomcat服务配置本地Apr库以提升性能
关于 apr 和 apr-util 对 Tomcat 服务的性能提升的说明: 要测APR给tomcat带来的好处最好的方法是在慢速网络上(模拟Internet),将Tomcat线程数开到300以上的水平,然后模拟一大堆并发请求。如果不配APR,基本…...
普通人在当前大环境下——少看宏观,多看具体
前言 宏观叙事,简而言之,就是从宏观把握历史社会的发展,寻找其中永恒的共性。我们大概听过此类的话:贸易战导致本地经济下滑、气候变化是因为过去几十年的工业发展、大环境不行导致不赚钱。此类叙事方式,身边人聊的甚欢,在媒体、社交圈、日常社群交流中,随处可见。以前…...
用echarts在vue2中实现3d饼图
先看效果,再看文章: 一、安装插件 3d的图不仅用到echarts,还用到了echarts-gl,因此都需要安装一下哦~ npm install echarts npm install echarts-gl2.0.9 //可以指定版本,也可不指定二、在main.js中引入 import * …...
低代码助力软件开发
低代码开发工具正在日益变得强大,它正不断弥合着前后端开发之间的差距。对于后端来说,基于低代码平台开发应用时,完全不用担心前端的打包、部署等问题,也不用学习各种框架(Vue、React、Angular等等)&#x…...
C嘎嘎之类和对象上
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:掌握类的引用和定义,熟悉类成员函数的…...
Vue 3使用 Iconify 作为图标库与图标离线加载的方法、 Icones 开源在线图标浏览库的使用
之前一直naive-ui搭配使用的是xicons,后来发现Iconify支持的图标合集更多,因此转而使用Iconify。 与FontAwesome不同的是,Iconify配合Icones相当于是一个合集,Iconify提供了快捷引入图标的方式,而Icones是一个大的图标…...
springboot+vue基于Spark的共享单车数据存储系统的设计与实现【内含源码+文档+部署教程】
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…...
如何使双核心的ESP32开启双核功能同时执行多任务
如何使双核心的ESP32开启双核功能同时执行多任务 简介查看ESP32当前哪一个内核在执行任务双核同时执行任务总结 简介 ESP32-WROOM-32模组内置两个低功耗 Xtensa 32-bit LX6 MCU,两个 CPU 核(core 0与core 1)可以被单独控制。可以在两个内核上…...
Node.js在Python中的应用实例解析
随着互联网的发展,数据爬取成为了获取信息的重要手段。本文将以豆瓣网为案例,通过技术问答的方式,介绍如何使用Node.js在Python中实现数据爬取,并提供详细的实现代码过程。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境…...
LC-2316. 统计无向图中无法互相到达点对数(DFS、并查集)
2316. 统计无向图中无法互相到达点对数 中等 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。 请你返回 无法互相…...
git笔记 - 常用记录
第1阶段 - Git简介 什么是Git及其重要性?基本的Git概念和术语 仓库(Repository):也称为 repo,是存储代码和版本历史的地方。它可以是本地仓库(在本地计算机上)或远程仓库(在服务器…...
无纸化办公小程序数据交互、wxs的使用
前言 很多同志们再写小程序的过程中,不知道该怎么发起HTTP请求到后端,在Web环境中发起HTTPS请求是很常见的,但是微信小程序是腾讯内部的产品,不能直接打开一个外部的链接。例如,在微信小程序中不能直接打开www.taobao…...
Python之哈希表-哈希表原理
Python之哈希表-哈希表原理 集合Set 集合,简称集。由任意个元素构成的集体。高级语言都实现了这个非常重要的数据结构类型。Python中,它是可变的、无序的、不重复的元素的集合 初始化 set() -> new empty set objectset(iterable) -> new set …...
sql server2014如何添加多个实例 | 以及如何删除多个实例中的单个实例
标题sql server2014如何添加多个实例 前提(已安装sql server2014 且已有默认实例MSSQLSERVER) 添加新的实例 其实就是根据安装步骤再安装一次(区别在过程中说明) 双击安装 选择“全新独立安装或添加现有功能” 然后下一步下一…...
别再盲目memcpy!嵌入式C中模型权重加载的4种内存对齐误用,已致3起量产固件崩溃
更多请点击: https://intelliparadigm.com 第一章:嵌入式C中模型权重加载的内存对齐本质与危害全景 内存对齐的本质:硬件访问契约 在ARM Cortex-M系列或RISC-V嵌入式平台中,CPU对非对齐地址执行32位读写会触发硬故障(…...
C++26反射能否取代宏+CodeGen?实测37个工业级项目重构案例:平均节省21,400行胶水代码,但调试体验倒退2.8代——你敢上吗?
更多请点击: https://intelliparadigm.com 第一章:C26反射特性在元编程中的应用对比评测报告 C26 正式引入基于 std::reflexpr 的静态反射核心机制,标志着元编程从模板繁重范式迈向声明式、可读性优先的新阶段。相比 C20 的 constexpr 元编程…...
Android-Clean-Boilerplate与RxJava对比:为什么选择普通Java实现
Android-Clean-Boilerplate与RxJava对比:为什么选择普通Java实现 【免费下载链接】Android-Clean-Boilerplate This is starter template for writing Android apps using Clean architecture 项目地址: https://gitcode.com/gh_mirrors/an/Android-Clean-Boilerp…...
Profinet 转 IO-Link 主站网关如何应用?
一、适用工业场景SG-PN-IOL-8A-001 是工业级 Profinet 转 IO-Link 主站网关,用于将 IO-Link 从站设备、标准传感器、执行器接入 Profinet 总线控制系统。适用于汽车制造、智能产线、物流分拣、包装设备、机床自动化、装配工位、智能制造车间等场景,可实现…...
从游戏修改到逆向思维:用Cheat Engine教程1-4关,在Mac上开启你的第一堂内存扫描课
从游戏修改到逆向思维:用Cheat Engine在Mac上开启内存扫描实战 当你在游戏中按下"无敌模式"的瞬间,屏幕上的角色突然变得刀枪不入——这种看似魔法的操作背后,其实隐藏着计算机内存操作的奥秘。Cheat Engine(简称CE&…...
Windows 11极致精简指南:使用tiny11builder打造轻量级系统
Windows 11极致精简指南:使用tiny11builder打造轻量级系统 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 厌倦了Windows 11系统日益臃肿,…...
Linux服务器磁盘爆满?手把手教你用parted命令在线扩容/home分区(CentOS 8/9实战)
Linux服务器磁盘爆满?手把手教你用parted命令在线扩容/home分区(CentOS 8/9实战) 凌晨三点,监控系统突然发出刺耳的警报声——生产环境的/home分区使用率突破95%。作为运维工程师,这种场景再熟悉不过:应用日…...
差分放大器在高速信号链中的关键作用与设计实践
1. 差分放大器在高速信号链中的核心作用在现代无线通信和高速数据采集系统中,差分放大器扮演着信号调理的关键角色。这类器件通过独特的平衡架构,能够有效抑制共模噪声并显著降低偶次谐波失真。以THS4509为例,其1900MHz的带宽和6600V/s的压摆…...
Pytest及相关测试工具实战指南
一个完整的例子,手把手教你从零开始使用Pytest,Pytest-cov,Pylint,flake8。 例子:银行账户系统 编写测试 -> 检查覆盖率 -> 做静态分析 -> 代码风格检查 第一部分:Pytest入门 - 从零到熟…...
保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)
从零搭建USRP X410开发环境:Ubuntu 21.04下的UHD 4.1与Gnuradio 3.9实战指南 当USRP X410这款号称"业界最强SDR"的设备首次出现在我的实验室时,整个团队都为之兴奋。但随之而来的开发环境配置过程,却让我们深刻体会到什么叫做"…...
