设计模式: 访问者模式
文章目录
- 一、介绍
- 二、模式结构
- 三、优缺点
- 1、优点
- 2、缺点
- 四、应用场景
一、介绍
Visitor 模式(访问者模式)是一种行为设计模式,它允许在不修改对象结构的前提下,增加作用于一组对象上新的操作。就增加新的操作而言,Visitor 模式把新的操作作为访问者(Visitor)加到对象中,而不是修改那些类的代码。这样,新的操作就可以被应用到所有对象上,而无需修改这些对象的类。
二、模式结构
Visitor 模式主要包含以下几个角色:
- Visitor(访问者):接口声明了一个或多个访问操作,形成所有的具体元素角色必须实现的接口。
- ConcreteVisitor(具体访问者):实现 Visitor 接口,也就是实现一个具体的访问操作。
- Element(元素):声明了一个接受访问者对象的方法(即 accept 方法),该方法通常是一个空实现或只声明了接口。
- ConcreteElement(具体元素):实现了 Element 接口,存储或定义了一个相关的数据操作,并可以定义一个或多个 accept 操作,以便接受访问者的访问。
- ObjectStructure(对象结构):是一个元素的集合,且能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
三、优缺点
1、优点
- 增加新的操作很容易:只需要增加一个新的访问者类即可。
- 将有关的行为集中到一个访问者对象中:而不是分散到多个元素类中。
- 可以绕过通常的继承机制,来访问和修改一个类的内部状态。
- 使得增加新的元素类变得容易:因为接受操作被集中在一个访问者接口中,所以增加新的元素类不需要修改访问者类的代码。
2、缺点
- 增加新的元素类很困难:每增加一个新的元素类,都需要在所有的具体访问者类中增加相应的具体操作实现,这违反了“开闭原则”。
- 破坏封装:访问者可以访问并修改元素的状态,这可能会违反封装原则。
四、应用场景
- 当一个系统需要对一个对象结构中的对象进行很多不同的操作(这些操作彼此不相关),同时又不希望这些操作的方法定义在元素的类的里面时。
- 当需要对一个对象结构中的对象进行与对象本身无关的操作时。
- 当这些操作以后会动态地增加或减少时。
相关文章:
设计模式: 访问者模式
文章目录 一、介绍二、模式结构三、优缺点1、优点2、缺点 四、应用场景 一、介绍 Visitor 模式(访问者模式)是一种行为设计模式,它允许在不修改对象结构的前提下,增加作用于一组对象上新的操作。就增加新的操作而言,V…...
selenium底层原理详解
目录 1、selenium版本的演变 1.1、Selenium 1.x(Selenium RC时代) 1.2、Selenium 2.x(WebDriver整合时代) 1.3、Selenium 3.x 2、selenium原理说明 3、源码说明 3.1、启动webdriver服务建立连接 3.2、发送操作 1、seleni…...
【Solidity】继承
继承 Solidity 中使用 is 关键字实现继承: contract Father {function getNumber() public pure returns (uint) {return 10;}function getNumber2() public pure virtual returns (uint) {return 20;} }contract Son is Father {}现在 Son 就可以调用 Father 的 …...
docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2
背景 docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2 原因 Docker 镜像中的 glibc 版本要求 CPU 支持 x86-64-v2 指令集,而你的硬件不支持。 解决办法 降低minio对应的镜像版本 经过验证:qu…...
地图相册系统的设计与实现
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…...
使用vh和rem实现元素响应式布局
示例代码 height: calc(100vh 30rem) vh(Viewport Height):vh是一个相对单位,代表浏览器窗口高度的百分比,例如20vh就是浏览器窗口高度的20%。 rem(root em):rem是通过html根元素…...
螺旋矩阵 II(LeetCode)
题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 解题 def generateMatrix(n):matrix [[0] * n for _ in range(n)]top, bottom 0, n - 1left, right 0, n - 1num 1while top <…...
如何快速掌握一款MCU
了解MCU特点 rom ,ramgpiotimerpower 明确哪些资源是项目开发需要的 认真理解相关资料模块 开始编程 编写特别的验证程序(项目不紧)按照自己的理解编写(老司机,时间紧张) 掌握MCU基本功能 定时器 固…...
XSS-DOM
文章目录 源码SVG标签Dom-Clobbringtostring 源码 <script>const data decodeURIComponent(location.hash.substr(1));;const root document.createElement(div);root.innerHTML data;// 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitize…...
uniapp去掉页面导航条
在pages.json文件中,globalStyle中添加 ”app-plus“:{"titleNView":false }...
MySQL数据库专栏(三)数据库服务维护操作
1、界面维护,打开服务窗口找到MySQL服务,右键单击可对服务进行启动、停止、重启等操作。 选择属性,还可以设置启动类型为自动、手动、禁用。 2、指令维护 卸载服务:sc delete [服务名称] 例如:sc delete MySQL 启动服…...
【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端
【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端 前言Ymodom实现QT实现开源库的二次开发-1开源库的二次开发-2 串口方式实现TCP方式实现UDP方式实现补充:文件读取补充:QT 封装成EXE 前言 Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit ,基于…...
超详细!!!electron-vite-vue开发桌面应用之引入UI组件库element-plus(四)
云风网 云风笔记 云风知识库 一、安装element-plus以及图标库依赖 npm install element-plus --save npm install element-plus/icons-vue npm i -D unplugin-icons二、vite按需引入插件 npm install -D unplugin-vue-components unplugin-auto-importunplugin-vue-componen…...
【排序篇】实现快速排序的三种方法
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1 交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本1.2.2 挖坑法1.2.3 前后指针…...
Java 标识符(详解)
文章目录 一、简介二、命名规则三、命名规范 一、简介 在 Java 中,用于给变量、类、方法等命名的符号组合,我们称之为Java标识符,它就像是给这些编程元素贴上的独特标签,以便在程序中能够准确地引用和操作它们。 二、命名规则 标…...
2024年,有哪些优质的计算机书籍推荐?
在2024年,计算机领域的新书层出不穷,涵盖了从基础理论到前沿技术的多个方面。以下是今年出版的几本备受关注的计算机新书。 1. AI与机器学习类 1、深度学习详解 1.李宏毅老师亲笔推荐,杨小康、周明、叶杰平、邱锡鹏鼎力推荐! 2.数百万次播…...
Python基础知识点--总结
1. 注释 注释用于提高代码的可读性,在代码中添加说明文字,使代码更容易理解。 单行注释:使用 # 符号开头,注释内容在符号之后的行内。多行注释:使用三引号( 或 """)包裹注释内…...
高效记录与笔记整理的策略:工具选择、结构设计与复习方法
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
Request重复读的问题
换了新工作都有时间写文章,每天也是加班到很晚,也不是工作内容多,主要是还是效率低,要考虑多干的很心累。 一、关于request重复读的问题,从源码的角度来分析 为什么他不能重复读 跳转 再看源码前可能需要一些基础的…...
Linux学习第60天:Linux驱动开发的一些总结
今天是Linux驱动开发的最后一个章节,题目中标明是60天完成的,其实在实际学习及笔记的整理中不止是60天。中间有过断更,有时断更的时间还是挺长的。这是在整个Linux驱动开发学习中最不满意的地方。 题目为Linux学习,其实这个题目有…...
告别‘OSError‘:手把手教你为transformers库设置离线/代理模式,稳定加载预训练模型
构建稳定高效的Hugging Face模型加载环境:从原理到实践 当你在深夜赶项目进度时,突然遇到那个令人窒息的红色报错——"OSError: Couldnt connect to https://huggingface.co",这感觉就像在马拉松终点线前被绊倒。作为现代NLP开发的…...
格式排版改到崩溃?高校教授说用这几个AI论文写作工具
论文写作总让人头大?格式排版改到崩溃、文献检索效率低、逻辑结构不清晰……这些痛点你是不是也遇到过?其实,只要用对 AI 工具、走对流程,就能事半功倍。资深教授建议,从选题到降重,全程使用专业工具辅助&a…...
麦橘超然Flux部署避坑指南:常见错误与解决方法
麦橘超然Flux部署避坑指南:常见错误与解决方法 1. 部署前的环境准备 1.1 硬件与驱动检查 在部署麦橘超然Flux图像生成控制台前,确保你的硬件环境满足以下要求: 显卡:NVIDIA显卡(RTX 3060及以上)&#x…...
**发散创新:基于Go语言的服务网格实践与流量治理实战**在微服务架构日益复杂的今天,**服务网格(Service Mesh)**
发散创新:基于Go语言的服务网格实践与流量治理实战 在微服务架构日益复杂的今天,服务网格(Service Mesh) 已成为云原生生态中不可或缺的一环。它通过将网络通信逻辑从应用代码中剥离出来,实现了对服务间调用的精细化控…...
Wan2.1 VAE模型蒸馏与轻量化部署探索
Wan2.1 VAE模型蒸馏与轻量化部署探索 最近在折腾一些生成模型的实际落地,发现一个挺普遍的问题:模型效果是真好,但体积也是真的大,推理起来对硬件的要求不低。特别是想把模型搬到一些资源有限的边缘设备,或者希望降低…...
告别误码!深入剖析LVDS过采样数据恢复中的“时钟抖动”与“数据整型”
攻克LVDS过采样数据恢复中的时钟抖动与信号整型难题 在高速数字电路设计中,LVDS(低压差分信号)因其出色的抗干扰能力和低功耗特性,已成为板级高速数据传输的黄金标准。但当工程师们尝试通过过采样技术提升数据恢复可靠性时&#x…...
Vite 8 架构革新:从双引擎到 Rolldown 统一打包的演进之路
1. Vite 8 架构革新的背景与痛点 如果你用过 Vite 7 或更早版本,一定对它的闪电般开发体验印象深刻。这主要得益于 Vite 独特的双引擎架构:开发时用 esbuild 实现毫秒级启动,生产环境则用 Rollup 保证打包质量。但我在实际项目中发现…...
数字古籍获取:高效工具使用指南
数字古籍获取:高效工具使用指南 【免费下载链接】bookget bookget 数字古籍图书下载工具 项目地址: https://gitcode.com/gh_mirrors/bo/bookget 当你在研究清代方志时,面对图书馆网站繁琐的翻页操作和分散的资源链接,是否渴望一种能批…...
还在为多平台资源下载烦恼?这款工具让你一站式搞定网络内容保存
还在为多平台资源下载烦恼?这款工具让你一站式搞定网络内容保存 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gi…...
自媒体人的秘密武器:OpenClaw+Qwen3-32B-Chat全平台内容分发
自媒体人的秘密武器:OpenClawQwen3-32B-Chat全平台内容分发 1. 为什么我需要一个自动化内容分发助手 去年夏天,我同时运营着公众号、微博和短视频三个平台。每次创作完核心内容后,总要花大量时间做格式转换:把长文章拆成微博线程…...
