为型设计模式之访问者模式

【重温设计模式】访问者模式及其Java示例 访问者模式,就像一个开放的博物馆,它接受各种访问者的参观和操作,同时保持自身的稳定和完整。这种模式的灵活性和可扩展性,使得我们可以在不改变数据结构的前提下,添加新的操作,增强了系统的适应性和生命力。然而,正如同一枚硬币的两面,访问者模式的优点同时也是其缺点。它的开放性可能会破坏数据结构的封装性,使得数据结构的内部细节暴露给访问者,增加了数据的风险。同时,如果数据结构发生改变,所有的访问者都可能需要修改,增加了代码的维护难度。因此,是否使用访问者模式,需要我们根据实际的需求和条件,进行深思熟虑和权衡。 阅读详情

访问者模式

访问者模式属于行为型模式。它是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

访问者模式被称为最复杂的设计模式,使用频率不高。

访问者模式最大的优点就是增加访问者非常容易,如果要增加一个访问者,只要新实现一个访问者接口的类,从而达到数据对象与数据操作相分离的效果。

应用

1.数据结构稳定,作用于数据结构的操作经常变化的场景

2.需要数据结构与数据操作分离的场景

3.需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景
复制代码

举例:饭馆吃饭,饭馆菜品相对固定,但每天去吃饭的人是变化的,人即访问者。

主要角色

1.抽象访问者(Visitor)

接口或抽象类,定义了对每一个具体元素(Element)的访问行为visit()方法,其参数就是具体的元素(Element)对象

通常来说:Visitor的方法个数与元素(Element)个数是相等的。如果元素(Element)个数经常变动,会导致Visitor的方法也要进行变动

2.具体访问者(ConcreteVisitor)

实现对具体元素的操作

3.抽象元素(Element)

接口或抽象类,定义一个接受访问者访问的方法accept(),表示所有元素类型都支持被访问者访问

4.具体元素(Concrete Element)

具体元素类型,提供接受访问者的具体实现。通常的实现都为:visitor.visit(this)

5.结构对象(ObjectStruture)

该类内部维护了元素集合,并提供方法接受访问者对该集合所有元素进行操作

 

优缺点

优点:

1.解耦了数据结构与数据操作,使得操作集合可以独立变化

2.扩展性好:可以通过扩展访问者角色,实现对数据集的不同操作

3.元素具体类型并非单一,访问者均可操作

4.心各角色职责分离,符合单一职责原侧出前

缺点:

1.无法增加元素类型:若系统数据结构对象易于变化,经常有新的数据对象增加进来,则访问者类必须增加对应元素类型的操作,违背开闭原则

2.具体元素变更困难:具体元素增加属性,删除属性等操作会导致对应的访问者类需要进行相应的修改,尤其当有大量访问者类时,修改范围太大

3.违背依赖倒置原则:访问者依赖的是具体元素类型,而不是抽象

基本使用

创建抽象访问者

public interface IVisitor {

    void visit(ConcreteElementA element);

    void visit(ConcreteElementB element);
}

创建具体访问者

public class ConcreteVisitorA implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorA,访问结果: " + result);
    }

    public void visit(ConcreteElementB element) {
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorA,访问结果: " + result);
    }
}

public class ConcreteVisitorB implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorB,访问结果: " + result);
    }

    public void visit(ConcreteElementB element) {
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorB,访问结果: " + result);
    }
}

创建抽象元素

public interface IElement {
    void accept(IVisitor visitor);
}

创建具体元素

public class ConcreteElementA implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public String get() {
        return "我是具体元素ConcreteElementA";
    }
}

public class ConcreteElementB implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public String get() {
      return "我是具体元素ConcreteElementB";
    }
}

创建结构对象

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 static void main(String[] args) {
        // 结构对象
        ObjectStructure collection = new ObjectStructure();
        // 访问者A
        IVisitor visitorA = new ConcreteVisitorA();
        collection.accept(visitorA);
        System.out.println("------------------------------------");
        // 访问者B
        IVisitor visitorB = new ConcreteVisitorB();
        collection.accept(visitorB);
    }

具体访问者ConcreteVisitorA,访问结果: 我是具体元素ConcreteElementA
具体访问者ConcreteVisitorA,访问结果: 我是具体元素ConcreteElementB
------------------------------------
具体访问者ConcreteVisitorB,访问结果: 我是具体元素ConcreteElementA
具体访问者ConcreteVisitorB,访问结果: 我是具体元素ConcreteElementB

 

基于YOLO26的实时目标追踪实战:从训练到视频追踪(附完整可视化代码) 核心组合:YOLO26(高精度检测)+ ByteTrack(稳定追踪)是实时目标追踪的最优工业组合,Ultralytics内置集成无需额外开发;训练优化:追踪场景需优先提升检测框精度(增加box损失权重),保证ID稳定性;可视化核心:为每个ID分配唯一颜色、绘制运动轨迹、显示FPS,是落地场景的必备功能;性能调优:轻量化模型+降分辨率+OpenVINO导出,可在边缘设备(如研华工控机)实现实时追踪。这套代码可直接复用到智慧园区、停车场、工业产线等场景,仅需修改park.yaml中的类别和。 阅读详情

相关推荐

第十篇|网络子系统 ②——无损以太网、PFC/ECN、DCQCN 与拥塞可视化

网络部分了解了解

qq_37535542的博客 1876

Java设计模式--扩展型模式下访问者模式

访问者模式 Visitor 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。 如何解决:

zxl13735005529的博客 178

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 436

泛型与模式

                                                                           泛型与模式 模式是面向对象技术深入应用的产物,它给了我们代码极大的动态性和灵活性,保证了系统的可扩展性。这是我们在面向对象分析和编码过程中广泛的使用模式的最重要的原因。但是实际的系统的需求是复杂的,复杂到我们使用了成熟的面向对象技术和模式后,

软件的信雅达 2985

C-Lodop打印服务系统存在任意文件读取

C-Lodop打印服务系统存在任意文件读取

weixin_43567873的博客 2877

YOLOv11 Neck革新:当SDI遇上BiFPN,带你打造精度飙升的特征融合网络

对于科研:这是一个新颖的特征融合思路,能做出差异化的实验,发论文、做项目都很有价值;对于工程:它能解决小目标漏检、大目标定位不准的痛点,让你的检测系统在工业质检、智能安防等场景下更可靠;对于技术成长:掌握了SDI和BiFPN的设计逻辑,你再去看其他特征融合方法(比如FPN、PAN),会有“一通百通”的感觉,以后优化任何检测模型都能举一反三。如果你之前在目标检测的精度上遇到了瓶颈,不妨试试SDI+BiFPN——它就像给YOLOv11装上了“透视眼”,让模型能看清每一个细节。

FJN110的博客 303

C#设计模式之访问者模式

访问者模式 文章目录访问者模式模式分类模式产生的原因模式类图代码实现访问者模式总结访问者模式的优点:访问者模式的缺点: 本篇博客将介绍访问者模式,访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问者两个重要组成部分,这些被访问元素具有不同的类型,且不同的访问者可以对其施加不同的访问操作。当我们的数据集合存在多种不同的访问方式的时候,我们可以使用访问者模式。 模式分类 行为型设计模式。 模式产生的原因 在医生开具处方单后,很多医院都存在这样的处理流程:划价人员拿到处方单之后根据药品名称和数量计算总

BraveRunTo的博客 502

【定位模块算法】amcl(蒙特卡洛)粒子滤波定位算法(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言(1)amcl定位框架介绍(2)amcl定位框架组成(1)ROS-TF坐标转换树【ROS的工具】(2)robot_pose_ekf扩展卡尔曼位姿估计算法(3)定位amcl自适应蒙特卡洛定位,adaptive monte carlo localizaion**(3)amcl定位节点的订阅与发布(4)amcl定位功能包用法(1)编写amcl节点相关的launch(amcl_omni.l

qq_35635374的博客 4403

设计模式-23访问者模式 (Visitor Pattern) 源码实例大全

访问者模式是一种行为设计模式,允许在不修改对象结构的情况下定义新操作。本文通过Java标准库中的FileVisitor接口展示了模式实现,包括文件搜索访问者(FileSearchVisitor)和文件统计访问者(FileStatisticsVisitor)两个具体实现类。前者用于搜索匹配特定模式的文件,后者则统计文件数量、目录数量和文件大小等指标。该模式通过分离算法与对象结构,实现了对文件系统的高效遍历和灵活操作,同时保持代码的可扩展性。

d3y1`5 81_09 701

(功能安全六)硬件FMEDA计算

FMEDA(故障模式、影响与诊断分析)是功能安全验证的核心方法,通过量化分析硬件故障模式及其影响,计算SPFM、LFM、PMHF等关键指标。分析过程包含六大步骤:计算元器件失效率、识别故障模式、评估安全机制诊断覆盖率、分类计算各类失效率、量化指标计算及设计优化。输入需要系统架构图、硬件故障模式清单等资料,输出安全指标达标情况及改进建议,确保设计满足ASIL等级要求。该方法通过系统化的故障分类和量化评估,为硬件安全设计提供科学依据。

Dayongger的博客 1454

微信小程序 - error_msg:net::ERR_CONNECTION_RESET“(“errno“:600001,“errMsg“:“uploadFile:fail errcode:-101)

"errno":600001,"errMsg":"uploadFile:fail errcode:-101 cronet_error_code:-101 error_msg:net::ERR_CONNECTION_RESET"微信小程序,微信小程序wx.uploadFile报错,uniapp微信小程序uni.uploadFile上传文件报错,微信小程序调用wx.uploadFile返回错误ERR_CONNECTION_RESET,如何解决这个问题,上传图片出现报错,小程序上传视频报错,上传文件出现报错,如何

🏆 前端领域优质创作者 5417

祁宇,祁大神的访问者模式

好代码,共享,大家看. #包含<io流> 元<型名 T>构 访问者{虚 空 访问(T*)=0;}; 构 访问者令牌{虚~访问者令牌()=默认;}; 构 动物{ 虚 整 移动()=0; 虚 空 接受(访问者令牌*)=0; 虚~动物()=默认; }; 元<型名 T> 构 可访问:公 动物{ 空 接受(访问者令牌*v)盖{ ...

个人进步之路 1454

博途PLC模糊PID控制(附SCL完整源代码)

操作人员根据对象的当前状态和以往的控制经验,用手动控制的方法给出适当的控制量,对被控对象进行控制。用电脑模拟操作人员手动控制的经验,对被控对象进行控制。用模糊数学的知识模仿人脑的思维方式,对模糊现象进行识别和判决,给出精确的控制量,对被控对象进行控制。与经典控制理论和现代控制理论相比,模糊控制的特点是不需要建立对象的精确模型。根据操作人员手动控制的经验,总结的完整控制规则,在根据系统当前的运行状态,经过模糊推理,模糊判决等运算,求出控制量,实现对被控对象的控制。......

RXXW_Dor的博客 8967

Swift访问者模式:算法与数据结构的分离

你是否曾面对这样的困境:精心设计的表达式解析器,每添加一种新运算就需要修改抽象语法树(AST)节点类?或者在维护复杂数据结构时,因遍历逻辑分散在各个类中而难以调试?这些问题的根源在于**数据结构与操作逻辑的紧耦合**——当两者交织在一起时,系统的扩展性和可维护性会急剧下降。 访问者模式(Visitor Pattern)正是解决这一痛点的利器。它通过**双重分发机制**实现算法与数据结构的解耦,允...

gitblog_00426的博客 798

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c++访问者模式

访问者模式是为了给固定接口增加新的接口。访问者模式有一个巨大的缺陷就是需要增加接口的那个类不能再派生新的类。`c++`现在有了仿函数(重载括号)来替换这种模式,更加灵活。

waxtear的博客 403

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#中的访问者模式——5个版本

在本文中,您将找到一个描述C#访问者模式的教程。在讨论了GoF提出并在文献中经常提到的“经典访问者”版本之后,我们将看看其他四个版本的访问者模式,它们可以被视为“支持现代C#”的访问者的替代版本图案。

寒冰屋的专栏 617

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式 - 行为型模式_ 访问者模式Visitor Pattern

文章目录定义 定义 访问者模式是⼀种⾏为设计模式, 它能将算法与其所作⽤的对象隔离开来。 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 ...

小工匠 2万+

行为篇-访问者模式

文章目录前言一、多样化的商品1.商品抽象类2.糖果类、酒类、水果类二、多变的计价方法1. 访问者接口2.折扣计价访问者3.客户端类三、访问和承接1. 接待者接口2.重构糖果类3.客户端类总结 前言 访问者模式(Visitor)主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下。为了不“污染”数据本身,访问者模式会将多种算法独立归类,并在访问数据时根据数据类型自动切换到对应的算法,实现数据的自动响应机制,并且确保算法的自由扩展。 提示:以下是本篇文章正文内容,下面案例可供参考

qq_45701514的博客 449

老生常谈:访问者模式

访问者模式的目的: 封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 问题的提出:System.Collection命名空间下提供了大量集合操作对象。平时我们大多在集合中都是存储的同类型对象,像2.0中的泛型中就规定集合中只能存储指定的对象类型,要么是整形要么是字符型等,否则会报错。如果针对一个保存有不同类型...

weixin_30568715的博客 57

【设计模式】访问者模式

1 简介 访问者模式(Visitor Pattern)定义:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下,定义作用于这些元素的新操作。 访问者模式对“开闭原则”的支持存在倾斜性,增加新的访问者方便,但是增加新的元素很麻烦。 2 代码 (1)抽象访问者(Visitor) public abstract class Visitor { protec...

little_fat_sheep 596

访问者模式泛型版(C#)

访问者模式泛型版

257

详解设计模式:访问者模式

访问者模式(Visitor Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。 访问者模式 是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。 本篇文章内容包括:关于访问者模式、访问者模式 Demo

栗筝i的博客 7618

设计模式学习之访问者模式

访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问。访问者是

一个码农的博客 3万+

【设计模式二十五之访问者模式VisitorPattern】访问者VisitorPattern模式

访问者模式细说访问者模式细说访问者模式定义UML模型基于UML的代码场景一场景代码场景二场景代码访问者模式应用和注意事项 细说访问者模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说访问者模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 访问者模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 505
上一篇: 【Java·异常处理语句】throws/throw、try...catch、finally
下一篇: 【高并发】高并发 IO 核心基础
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值