Java23种设计模式-行为型模式之访问者模式

news/2024/10/20 0:27:42/

访问者模式(Visitor Pattern):主要用于解决对象结构中元素的行为操作问题。这种模式允许在不修改对象结构的情况下,为其添加新的操作。

主要角色:
访问者(Visitor):定义了一个访问元素的接口,为每个需要被访问的元素类都提供一个访问方法,即在Visitor中定义了一组方法,每个方法对应一个具体元素类。
具体访问者(ConcreteVisitor):实现Visitor接口,为每个访问操作提供实现,定义了对每一个元素的访问行为。
元素(Element):定义了一个接受访问者的接口,即一个accept方法,它接受一个访问者对象作为参数。
具体元素(ConcreteElement):实现Element接口的accept方法,将调用访问者对象的相应访问操作。
对象结构(ObjectStructure):一个包含元素集合的类,它可以是集合对象,也可以是图中的节点集合,它提供了一个方法用来遍历元素集合,并且允许访问者访问它的元素。
优点:
1.使得添加新的操作变得容易,因为你可以添加新的访问者类而不需要修改现有元素类。
2.将有关元素操作的算法从元素类中分离出来,有助于保持元素类的简单性。
缺点:
1.使得元素类与访问者类耦合在一起,因为元素类需要知道访问者类的存在。
2.对于已有的元素类,你不能使用访问者模式,除非它们重新设计以支持访问者模式
3.访问者模式增加了类的个数,可能会使得系统变得复杂。
适用场景:
1.当一个对象结构中的对象需要有多种不同的并且不相关的操作时。
2.当需要对一个对象结构添加新的操作,但是又希望不修改现有对象结构中的类时。

示例

// 元素接口
interface Element {void accept(Visitor visitor);
}
// 具体元素
class ConcreteElement implements Element {private String elementName;public ConcreteElement(String elementName) {this.elementName = elementName;}public String getElementName() {return elementName;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}
// 访问者接口
interface Visitor {void visit(ConcreteElement element);
}
// 具体访问者
class PrintVisitor implements Visitor {@Overridepublic void visit(ConcreteElement element) {System.out.println(element.getElementName());}
}
// 对象结构
class ObjectStructure {private List<Element> elements;public ObjectStructure(List<Element> elements) {this.elements = elements;}public void displayElements() {for (Element element : elements) {element.accept(new PrintVisitor());}}
}
// 客户端
public class Client {public static void main(String[] args) {List<Element> elements =new ArrayList<>();elements.add(new ConcreteElement("Element1"));elements.add(new ConcreteElement("Element2"));ObjectStructure objectStructure = new ObjectStructure(elements);objectStructure.displayElements();}
}

http://www.ppmy.cn/news/1442657.html

相关文章

汽车信息安全--如何理解TrustZone(1)

目录 1.车规MCU少见TrustZone 2. 什么是TrustZone 2.1 TrustZone隔离了什么&#xff1f; 2.2 处理器寄存器和异常处理 3.小结 1.车规MCU少见TrustZone 在车规MCU里&#xff0c;谈到信息安全大家想到的大多可能都是御三家的HSM方案&#xff1a;英飞凌的HSM\SHE、瑞萨的ICU…

Babylon.js 读取GLB模型元数据

如果你熟悉将 3D 资源导出到游戏引擎的过程&#xff0c;那么无疑也会熟悉 3D 资源的 PBR 和 GLB 导出过程。 这是我们之前概述的内容&#xff0c;也是我们交互式工作的所有资产准备的基石。 然而&#xff0c;从传统的管道意义上来说&#xff0c;能够用元数据标记网格有很多逻辑…

硬件解码后显存数据直接推理

网络摄像头为何可能比mipi速度快 网络摄像头解码的时候传输到内存中后数据比原始的rgb 图像要小很多&#xff0c;这时候直接传输到显卡以后解码&#xff0c;速度很快&#xff0c;而mipi摄像头如果不使用dma技术&#xff0c;结果会直接用rgb传输到显存中&#xff0c;可想而知&a…

本地wsl的Ubuntu安装docker,不使用docker桌面版

第一步&#xff1a;安装docker引擎 建议大家去docker官网那边看 Install Docker Engine on Ubuntu | Docker Docs 第二步&#xff1a;使用以下命令 sudo update-alternatives --config iptables 选1就对了 第三步&#xff1a;启动docker service docker start

嵌入式全栈开发学习笔记---Linux基本命令4

目录 压缩和解压缩 tar -zcf 压缩包的名字 需要压缩的文件 tar -xzf 压缩包的名字 查找命令 Find 路径 -name “文件名” grep “搜索的关键字” 路径 -R 我们最后学习几个命令&#xff1a; 我们有的时候下载一些文件、软件、库&#xff0c;它会以压缩包的形式出现&am…

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

Linux中文件描述符与重定向的深入探索

目录 1. 理解C语言的文件操作函数 2. 操作系统的文件操作接口 3. 文件描述符详解和其内核本质 4. 如何理解Linux下一切皆文件 5. Linux中的重定向 5.1 输出重定向 5.2 追加重定向 5.3 输入重定向 6. 结合文件描述符理解重定向 7.重定向的系统调用 在Linux操作系统中&a…

docker下载镜像到指定目录

要将Docker镜像下载到指定目录&#xff0c;您可以按照以下步骤操作&#xff1a; 下载镜像&#xff1a; 使用docker pull命令从Docker Hub或其他镜像仓库拉取所需的镜像。例如&#xff0c;要下载名为nginx、标签为latest的镜像&#xff0c;可以运行docker pull nginx:latest。 保…