设计模式——访问者模式(Visitor)

访问者模式(Visitor Pattern)是一种将数据操作与数据结构分离的设计模式。这种模式适用于数据结构相对稳定,而操作算法经常改变的情况。访问者模式将数据结构(稳定的部分)中的元素(Element)的访问行为(变化的部分)封装在一个独立的访问者(Visitor)类中,使得可以在不修改数据结构的前提下增加新的操作。

访问者模式包含以下几个角色:

  1. Visitor(访问者):接口声明了一个或多个访问操作,每个操作对应数据结构中的一种可能元素类型。

  2. ConcreteVisitor(具体访问者):实现Visitor接口,为每个Element类提供一个访问操作实现,该操作会执行相应的业务逻辑。

  3. Element(元素):接口或抽象类,定义了一个接受访问者(accept)的方法,该方法通常以访问者作为参数。

  4. ConcreteElement(具体元素):实现了Element接口或继承了Element抽象类,实现了accept()方法,该方法通常调用访问者的访问操作并传入自己作为参数。

  5. ObjectStructure(对象结构):是元素的集合,它可以是组合模式的结构、数组或其他数据结构。它提供一种让访问者可以访问其所有元素的能力,如可以遍历所有元素并调用元素的accept()方法。

以下是访问者模式的一个简单Java代码示例:

// 访问者接口
public interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}// 具体访问者
public class ConcreteVisitor implements Visitor {@Overridepublic void visit(ConcreteElementA element) {System.out.println("Visiting ConcreteElementA: " + element.operationA());}@Overridepublic void visit(ConcreteElementB element) {System.out.println("Visiting ConcreteElementB: " + element.operationB());}
}// 元素接口
public interface Element {void accept(Visitor visitor);
}// 具体元素A
public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationA() {return "ConcreteElementA";}
}// 具体元素B
public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationB() {return "ConcreteElementB";}
}// 对象结构示例(这里使用简单的集合)
import java.util.ArrayList;
import java.util.List;public class ObjectStructure {private List<Element> elements = new ArrayList<>();public void attach(Element element) {elements.add(element);}public void detach(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 客户端代码
public class Client {public static void main(String[] args) {ObjectStructure os = new ObjectStructure();os.attach(new ConcreteElementA());os.attach(new ConcreteElementB());Visitor visitor = new ConcreteVisitor();os.accept(visitor);}
}

在上面的示例中,ConcreteVisitor实现了Visitor接口,并为每种类型的Element提供了访问方法。ConcreteElementAConcreteElementB实现了Element接口,并实现了accept方法以接受访问者。ObjectStructure作为元素的集合,它允许访问者访问其所有元素。客户端代码创建了ObjectStructure实例,并添加了一些Element实例,然后创建了一个Visitor实例,并让ObjectStructure接受这个Visitor。这样,Visitor就能够访问所有的Element实例,并执行相应的操作。

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

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

相关文章

C语言题目:一元二次方程

题目描述 解一元二次方程ax^2bxc0的解。 输入格式 a,b,c的值。 输出格式 输出两个解&#xff0c;按照大小顺序输出&#xff0c;一个解时需要打印两次&#xff0c;不用考虑无解问题&#xff0c;保留两位小数 样例输入 1 5 -2样例输出 0.37 -5.37 代码解析 首先&#xff0…

了解进程和线程

一、进程和线程 类比&#xff1a; 一个工厂&#xff0c;至少有一个车间&#xff0c;一个车间中至少有一个工人&#xff0c;最终是工人在工作。 一个程序&#xff0c;至少有一个进程&#xff0c;一个进程中至少有一个线程&#xff0c;最终是线程在工作。 进程&#xff1a;是计…

C#正则表达式,提取信息使用

正则表达式简介 在C#中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;通常简写为regex或regexp&#xff09;是一种功能强大的文本处理工具&#xff0c;它使用特定的字符序列来定义搜索模式&#xff0c;从而实现对文本的高效搜索、匹配和替换操作。正则表达…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 &#xff08;一&#xff09;挖掘乡村自然资源优势&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘乡村文化资源内涵&#xff0c;丰富旅游活动内容 四、促进农…

新手做视频号电商,做什么样的产品好卖?适合不会选类目的新手看

大家好&#xff0c;我是电商花花&#xff0c;专注做电商的花花。 视频号现在的发展可以说是非常好的&#xff0c;拥有着空前的市场和流量&#xff0c;随着视频号小店新项目对电商的冲击&#xff0c;让更多创业者和新手商家开始涌入视频号电商的行列。 想要在新项目中抢占流量…

【客户案例】禅道软件助力长虹新网实现研发项目管理创新

四川长虹新网科技有限责任公司&#xff08;以下简称长虹新网&#xff09;深耕全球运营商市场二十多年&#xff0c;具备行业领先的软硬件研发、制造、全球化市场营销能力&#xff0c;持续服务国内外200多家主流电信及广电运营商、垂直行业服务商&#xff0c;与合作伙伴共同成长。…

Windows11系统安装Mysql8之后,启动服务net start mysql报错“服务没有响应控制功能”的解决办法

问题 系统环境&#xff1a;Windows11 数据库版本&#xff1a;Mysql8 双击安装&#xff0c;一路下一步&#xff0c;完成&#xff0c;很顺利&#xff0c;但是开启服务后 net start mysql 报错&#xff1a; 服务没有响应控制功能。 请键入 NET HELPMSG 2186 以获得更多的帮助 不…

【项目001】运维工程师项目实践:高可用性云基础设施部署与升级项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 1、什么是ELK&#xff1f; 2、什么是Elasticsearch、Logstash 和Kibana&#xff1f; 3、ELK 三…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

【chisel】如何用chisel写一个上升沿检测程序

自定义上升沿检测 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定义 risingedge 函数def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代码签名证书的重要作用及申请途径

代码签名技术是一种确保软件完整性和来源可信度的安全措施。它通过数字证书和加密算法为软件代码或可执行文件加上一个“签名”&#xff0c;以此验证软件未被篡改&#xff0c;并确认其来源于可信赖的开发者。 一、代码签名证书的重要作用 1、提高下载率和安装率&#xff1a;用…

Linux提权--Rsync(未授权访问) Docker 组挂载

免责声明:本文仅做技术学习与交流... 目录 Rsync&#xff08;未授权访问&#xff09; 介绍: 靶场及过程: 提权过程&#xff1a; Docker 组挂载 原理: 复现&#xff1a; 利用&#xff1a; 具体操作: 1-确定是否有docker服务 2-查看用户是否在docker组里面 3-执行命…

包管理工具npm、cnpm、yarn、NVM

文章目录 npmnpm基本使用npm搜索包生产环境与开发环境开发依赖与生产依赖全局安装环境变量Path安装包依赖安装指定版本的包、删除依赖配置命令别名 cnpm安装操作命令&#xff1a;配置 yarnyarn安装及常用命令yarn 配置淘宝镜像 NVM使用常用命令 扩展内容npm和yarn的选择npm发布…

USB转串口芯片CH341、CH372、CH374、CH375等的电路及 PCB 设计的重要注意事项

前言 USB芯片的电路和PCB设计参考及注意事项&#xff0c;含CH34X、CH37X等系列芯片的电路设计说明。涉及工作稳定性和抗干扰以及USB-HOST带电热插拔。基于 USB 芯片的电路及 PCB 设计的重要注意事项 版本&#xff1a;2E 1、摘要 本文主要针对以下因电路及 PCB 设计不佳而引起…

文档解析与向量化技术加速多模态大模型训练与应用

前言 随着人工智能技术的不断发展&#xff0c;多模态大模型作为一种新型的机器学习技术&#xff0c;逐渐成为人工智能领域的热点话题。多模态大模型能够处理多种媒体数据&#xff0c;如文本、图像、音频和视频等&#xff0c;并通过学习不同模态之间的关联&#xff0c;实现更加…

Q1咖啡机行业线上市场(京东天猫淘宝)销售数据分析

回顾疫情那几年&#xff0c;咖啡机市场可能是大环境带动下爆发飞速的品类之一。在整体厨房小家电大盘销售不佳的情况下&#xff0c; 咖啡机市场的表现是亮眼的。而今年Q1季度&#xff0c;在厨卫小电市场整体低迷的状态下&#xff0c;咖啡机市场依然保持着稳中向好的趋势。 根据…

Windows 命令修改时间

Windows 命令修改时间 运行w32tm /resync&#xff0c; 显示“此计算机没有重新同步&#xff0c;因为没有可用的时间数据”&#xff0c; 运行w32tm /query /source &#xff0c; 显示“Local CMOS Clock”&#xff0c;表示正在使用的是主板上的时间&#xff0c;没有使用外部…

树莓派|连接CSI接口摄像头+opencv

CSI&#xff08;Camera Serial Interface&#xff09;接口摄像头是一种常见的嵌入式系统或移动设备中使用的摄像头接口。它通常用于与处理器或图像传感器进行直接连接&#xff0c;实现高速的图像数据传输。 CSI接口摄像头具有以下特点&#xff1a; 高速传输&#xff1a;CSI接口…

Spring MVC(五) 文件上传

1 单文件上传 在程序开发中&#xff0c;有时候需要上传一些文件。我们在学习Servlet的时候&#xff0c;也做过文件上传的操作&#xff0c;只不过基于Servlet的文件上传操作起来过于复杂&#xff0c;因此所有的MVC框架都提供了自己的文件上传操作&#xff0c;基本上都是基于File…

UE5 FARFilter筛选器使用方法

UE5 查找资源时可以用FARFilter进行筛选&#xff0c;之前可以用ClassNames进行筛选&#xff0c;但是5.1之后就弃用这个属性改成ClassPaths属性 构造一个FTopLevelAssetPath对象需要两个FName参数&#xff0c;但是没找到应该传什么 查找官方文档&#xff0c;明显是错误的&#x…