访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)
定义
访问者模式(Visitor Pattern)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
该模式的主要思想是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使得可以在不改变数据结构的前提下添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。
属于行为型模式。
适用场景
- 数据结构稳定,作用于数据结构的操作经常发生变化的场景;
- 需要数据结构与数据操作分离的场景;
- 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。
标准示例
- Visitor(抽象访问者):定义一个访问具体元素的接口,该接口内部包含了对所有具体元素的访问方法。
- ConcreteVisitor(具体访问者):实现Visitor接口,针对特定类型的元素执行具体访问操作。
- Element(抽象元素):定义一个接受访问操作的接口,通常包含一个accept()方法,该方法接收一个访问者对象作为参数。
- ConcreteElement(具体元素):实现了Element接口,存储了实际的数据,并提供接受访问者访问的方法实现。
- ObjectStructure(对象结构):管理元素的集合,通常包含add、remove等方法以及一个遍历所有元素的accept()方法,该方法接收一个访问者对象作为参数,并遍历所有元素,让每个元素接受访问者的访问。

代码:
public interface IVisitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}
public class ConcreteVisitorA implements IVisitor {public void visit(ConcreteElementA element) {String result = element.operationA();System.out.println( element.getClass().getSimpleName() + " : " + result);}public void visit(ConcreteElementB element) {int result = element.operationB();System.out.println( element.getClass().getSimpleName() + ": " + result);}
}
public class ConcreteVisitorB implements IVisitor {public void visit(ConcreteElementA element) {String result = element.operationA();System.out.println(element.getClass().getSimpleName() + ": " + result);}public void visit(ConcreteElementB element) {int result = element.operationB();System.out.println( element.getClass().getSimpleName() + ": " + result);}
}
public interface IElement {void accept(IVisitor visitor);
}
public class ConcreteElementA implements IElement {public void accept(IVisitor visitor) {visitor.visit(this);}public String operationA() {return this.getClass().getSimpleName();}}
public class ConcreteElementB implements IElement {public void accept(IVisitor visitor) {visitor.visit(this);}public int operationB() {return new Random().nextInt(10);}
}
public class ObjectStructure {private List<IElement> list = new ArrayList<IElement>();{this.list.add(new ConcreteElementA());this.list.add(new ConcreteElementB());}public void accept(IVisitor visitor) {for (IElement element : this.list) {element.accept(visitor);}}
}
public class Test {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure(); IVisitor visitorA = new ConcreteVisitorA();objectStructure.accept(visitorA);System.out.println("***************************************");IVisitor visitorB = new ConcreteVisitorB();objectStructure.accept(visitorB);}}
输出结果:
ConcreteElementA: ConcreteElementA
ConcreteElementB: 5
***************************************
ConcreteElementA: ConcreteElementA
ConcreteElementB: 4
以上就是访问者模式全部内容,感谢阅读!
相关文章:
访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 定义 访问者模式(Visitor Pattern) 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 该模式的主要思想是将作用于某种数据结构中的各…...
mac如何查看cpu和显卡温度
在Mac上查看CPU和显卡温度,你可以使用以下几种方法: 方法1:使用内建工具“活动监视器” 虽然“活动监视器”不能直接显示温度信息,但它可以显示CPU使用情况等信息。 打开“活动监视器”,可以通过以下路径找到&#…...
MongoDB教程(六):mongoDB复制副本集
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MongoD…...
牛客小白月赛98 (个人题解)(补全)
前言: 昨天晚上自己一个人打的小白月赛(因为准备数学期末已经写烦了),题目难度感觉越来越简单了(不在像以前一样根本写不了一点,现在看题解已经能看懂一点了),能感受到自己在不断进步…...
Ubuntu压缩解压各类型文件
在Ubuntu系统中,解压不同格式的压缩文件可能需要安装不同的工具。以下是一些常见的压缩格式和相应的安装命令: ZIP文件: 工具:unzip 安装命令: sudo apt install unzip 解压命令 unzip filename.zip 如果需要保留目录…...
昇思学习打卡-20-生成式/GAN图像生成
文章目录 网络介绍生成器和判别器的博弈过程数据集可视化模型细节训练过程网络优缺点优点缺点 网络介绍 GAN通过设计生成模型和判别模型这两个模块,使其互相博弈学习产生了相当好的输出。 GAN模型的核心在于提出了通过对抗过程来估计生成模型这一全新框架。在这个…...
javafx、node js、socket、OpenGL多线程
机器学习、算法、人工智能、汇编(mips、arm、8086)、操作系统、数据挖掘、编译原理、计算机网络、Arena软件、linux xv6、racket、shell、Linux、PHP、Haskell、Scala、spark、UML、mathematica、GUI、javafx、node js、socket、OpenGL、多线程、qt、数据…...
【学习笔记】无人机(UAV)在3GPP系统中的增强支持(七)-通过无人机实现无线接入的独立部署
引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…...
模糊综合评价
对多因素影响的事务的评价(如人才,方案,成果),有时难以给出影响的确切表达,此时可以采取模糊综合评价的方法。 该方法可以对人,事,物进行比较全面而又定量化的评价。 实例1ÿ…...
系统测试-白盒测试学习
目录 1、语句覆盖法: 2、判定覆盖法: 3、条件覆盖法: 4、判定条件覆盖: 5、条件组合的覆盖: 6、路径覆盖: 黑盒:需求 白盒:主要用于单元测试 1、语句覆盖法: 程序…...
UI设计工具选择指南:Sketch、XD、Figma、即时设计
在数字产品设计产业链中,UI设计师往往起着连接前后的作用。产品经理从一个“需求”开始,制定一个抽象的产品概念原型。UI设计师通过视觉呈现将抽象概念具体化,完成线框图交互逻辑视觉用户体验,最终输出高保真原型,并将…...
Pycharm 导入 conda 环境
使用时经常在此处卡壳,在此做个记录。 这个位置选择 conda 安装路径下的 python.exe 文件即可...
Vue封装Tooltip(提示工具)
<template> <div class"tooltip" mouseover"showTooltip" mouseleave"hideTooltip"> <slot></slot> <!-- 使用slot来接收传入的内容 --> <span class"tooltiptext" v-if"visible">{…...
Go 1.19.4 函数-Day 08
1. 函数概念和调用原理 1.1 基本介绍 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称,返回类型,和参…...
Docker-Nvidia(NVIDIA Container Toolkit)
安装NVIDIA Container Toolkit工具,支持docker使用GPU 目录 1.NVIDIA Container Toolkit 安装1.1 nvidia-docker安装1.2 验证1.2.1 验证安装1.2.2 额外补充 1.NVIDIA Container Toolkit 安装 1.1 nvidia-docker安装 NVIDIA/nvidia-docker Installing the NVIDIA …...
Mongodb 3.6 数据恢复操作
一、安装MongoDB 忽略 二、创建账号和授权 在新的MongoDB上创建用户管理员。先切换到admin库,然后通过命令创建数据库管理员账号和密码。最后再验证账号密码是否创建成功! use admin db.createUser({user:"root",pwd:"123456Ab",…...
C++ | Leetcode C++题解之第238题除自身以外数组的乘积
题目: 题解: class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…...
挂耳式蓝牙耳机什么牌子好?这五款综合表现遥遥领先
为什么这几年开放式耳机受到了越来越多消费者的喜爱?我想是因为它全方位的弥补了入耳式耳机堵塞耳朵、不够安全健康的缺陷,真正做到了安全性与舒适性兼得。那么刚入坑开放式耳机的小白该如何挑选一款品质较高的开放式耳机呢?挂耳式蓝牙耳机什…...
防火墙-NAT策略和智能选路
一、背景技术 在日常网络环境,内部网络想要访问外网无法直接进行通信,这时候就需要进行NAT地址转换,而在防火墙上配置NAT和路由器上有点小区别,思路基本一致,这次主要就以防火防火墙配置NAT策略为例,防火墙…...
一键优雅为Ubuntu20.04服务器挂载新磁盘
itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、小于2T磁盘挂载方式 1.1 安装磁盘到电脑后启动系统 1.2 查找未分区的磁盘 打…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
