【设计模式】—-(23)访问者模式(行为型)

【从零入门23种设计模式24】行为型之访问者模式 访问者模式是一种行为型设计模式,其核心思想是将数据结构与数据操作分离,使操作可以独立于数据结构变化。该模式通过定义作用于对象结构中各元素的操作接口,实现"数据不动,操作动"的效果。主要优点包括解耦数据结构与操作、集中管理同类操作、支持多态操作等,适用于数据结构稳定但操作频繁变化的场景,如电商数据统计、报表生成等。典型实现包含抽象元素、具体元素、抽象访问者和具体访问者等角色,通过双分派机制实现差异化操作。该模式在JDK、Spring等框架中广泛应用,如文件处理、SQL解析等场景。 阅读详情

今天来看最后一个设计模式——-访问者模式(行为型) 

——瞬间有一种忽如一夜春风来的感觉,明天总结下设计模式行为型的小结,然后再做个所有设计模式的总结。


一、定义(概念)

表示一个作用于某对象结构中的各元素的操作。
使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

二、适用场景

1、一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
3、当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4、 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。


涉及角色:
1、访问者(Visitor):定义接口,声明一个或多个访问操作。 
2、具体访问者(ConcreteVisitor):实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。 
3、元素(Visitable):声明一个接受操作,接受一个访问者对象作为一个参数。 
4、具体元素结点(ConcreteElement):实现抽象结点所规定的接受操作。 
5、对象结构(ObjectStructure):
——能枚举它的元素
——可以提供一个更高层的接口以允许该访问者访问它的元素
——可以是一个复合
可以遍历结构中的所有元素,提供一个接口让访问者对象都可以访问每一个元素。 

三、UML



四、代码

抽象元素类
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. abstract class Element {    
  2.     public abstract void accept(IVisitor visitor);    
  3.     public abstract void doSomething();    
  4. }    
元素类
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. class ConcreteElement1 extends Element {    
  2.     public void doSomething(){    
  3.         System.out.println("这是元素1");    
  4.     }    
  5.         
  6.     public void accept(IVisitor visitor) {    
  7.         visitor.visit(this);    
  8.     }    
  9. }    
  10.     
  11. class ConcreteElement2 extends Element {    
  12.     public void doSomething(){    
  13.         System.out.println("这是元素2");    
  14.     }    
  15.         
  16.     public void accept(IVisitor visitor) {    
  17.         visitor.visit(this);    
  18.     }    
  19. }    
抽象访问者
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. interface IVisitor {    
  2.     public void visit(ConcreteElement1 el1);    
  3.     public void visit(ConcreteElement2 el2);    
  4. }    
访问者
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. class Visitor implements IVisitor {    
  2.     
  3.     public void visit(ConcreteElement1 el1) {    
  4.         el1.doSomething();    
  5.     }    
  6.         
  7.     public void visit(ConcreteElement2 el2) {    
  8.         el2.doSomething();    
  9.     }    
  10. }   
结构对象
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. class ObjectStruture {    
  2.     public static List<Element> getList(){    
  3.         List<Element> list = new ArrayList<Element>();    
  4.         Random ran = new Random();    
  5.         for(int i=0; i<10; i++){    
  6.             int a = ran.nextInt(100);    
  7.             if(a>50){    
  8.                 list.add(new ConcreteElement1());    
  9.             }else{    
  10.                 list.add(new ConcreteElement2());    
  11.             }    
  12.         }    
  13.         return list;    
  14.     }    
  15. }    
客户端
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Client {    
  2.     public static void main(String[] args){    
  3.         List<Element> list = ObjectStruture.getList();    
  4.         for(Element e: list){    
  5.             e.accept(new Visitor());    
  6.         }    
  7.     }    
  8. }   
五、小结(优点与缺点)


优点:
符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的,所以当发生变化时,就可以在不改变元素类本身的前提下,实现对变化部分的扩展。
扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。


缺点:
增加新的元素类比较困难。通过访问者模式的代码可以看到,在访问者类中,每一个元素类都有它对应的处理方法,也就是说,每增加一个元素类都需要修改访问者类(也包括访问者类的子类或者实现类),修改起来相当麻烦。也就是说,在元素类数目不确定的情况下,应该慎用访问者模式。所以,访问者模式比较适用于对已有功能的重构,比如说,一个项目的基本功能已经确定下来,元素类的数据已经基本确定下来不会变了,会变的只是这些元素内的相关操作,这时候,我们可以使用访问者模式对原有的代码进行重构一遍,这样一来,就可以在不修改各个元素类的情况下,对原有功能进行修改。


Java编程23种设计模式实战篇4:Java设计模式_(行为型)_访问者模式 引用百科 访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。 定义(源于GoF《Design Pattern》):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 从定义可以看出结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法。这便类似于Java语言当中的collection概念了。 相关角色 1.抽象访. 阅读详情

相关推荐

从零开始安装 Windows 11 和 Ubuntu 22.04 双系统

本文详解Windows与Ubuntu 22.04双系统安装流程:需提前确认BIOS模式(UEFI/GPT或Legacy/MBR),关闭BitLocker加密、设备加密及快速启动;推荐Rufus/Ventoy制作启动盘。安装时需规划分区方案(建议单独划分EFI系统分区),注意引导器安装位置选择。双系统启动通过BIOS引导顺序管理,安装后需同步Windows与Linux系统时间。教程适配主流UEFI+GPT设备,强调操作前数据备份及Windows更新策略调整,避免兼容性问题。

萑澈的博客 3775

【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】

【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】通俗来说就是:不同的人对同一件事情有着不同的处理方式。仔细思考一下我们会发现:人对应的Element接口,男人女人就是俩个具体实现类,成功和恋爱的状态就是Visitor,每个状态下对应的不同的是Element具体实现类的不同处理方式,由此对应的是俩个具体Visitor实现类,最后多个Element元素需要我们使用集合来存储。访问者模式:使用了一个访问者类,它改变了元素类的执行算法。

Coder_ljw的博客 575

DVWA靶场实战:从搭建到渗透测试的完整指南

本文详细介绍了DVWA靶场的搭建与渗透测试全流程,涵盖LAMP环境搭建、Docker部署及集成环境安装三种方式。通过SQL注入、文件上传漏洞等实战案例,帮助读者掌握Web安全测试技巧,并提供防御方案与进阶调优建议,是网络安全学习的实用指南。

weixin_28312391的博客 490

Java23种设计模式——21.行为型模式之访问者模式

Java中除去有设计原则之外,还有23中设计模式。 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。 并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。 那我们今天要学习行为型模式中的访问者模式 ! 访问者模式 先来了解一下什么是访问者模式 通过百科,我们可以知道,这个模式是非常的难,但是我们还是得需要去学习 这个模式可以去做什么呢?比如说一个电视剧里面的角色,你看是一种样子,我们是另外一种样子。 访问者模式的定义与特...

胖子胖子大胖子的博客 1038

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

第4章 Stata参数检验

目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进...

qq_45112156的博客 1万+

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

在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示。 在软件开发中,有时候也需要处理像处方单这样的集合对象结构,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式。在设计模式中,有一种模式可以满足上述要求,...

诚 784

CNN卷积神经网络手写数字识别实例及代码详解

本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_

VivienFu的专栏 6万+

23种设计模式-行为型模式之访问者模式(Java版本)

访问者模式是一种行为型设计模式,它使得你可以在不修改对象结构的情况下,定义作用于该结构的操作。通过将操作从对象本身移到访问者类中,可以在不改变类的情况下,对其增加新的操作。访问者模式的关键思想是将“数据”和“操作”分离,允许在对象结构不变的情况下添加新的操作。它通常用于对象结构是类群体的场景。

DreamCollector的博客 696

2025 高效抓取雪球社区数据:自动化导出Excel与PDF全攻略

本文详细介绍了2025年高效自动化抓取雪球社区数据的完整方案。通过Python脚本,用户可自动抓取帖子列表数据并导出为结构化的Excel表格,同时批量将帖子内容保存为PDF文档,并支持合并与添加书签,极大提升投资研究和信息整理的效率。

weixin_29034963的博客 693

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1137

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

(ObjectStructure):一个包含元素集合的类,它可以是集合对象,也可以是图中的节点集合,它提供了一个方法用来遍历元素集合,并且允许访问者访问它的元素。(Visitor):定义了一个访问元素的接口,为每个需要被访问的元素类都提供一个访问方法,即在Visitor中定义了一组方法,每个方法对应一个具体元素类。(Element):定义了一个接受访问者的接口,即一个accept方法,它接受一个访问者对象作为参数。1.使得元素类与访问者类耦合在一起,因为元素类需要知道访问者类的存在。

csy08845的博客 817

FTU电科院检测学习笔记-规划

如果写到最后,还非常的有动力和兴趣,可能会举出一些特定的例子来,但不保证一定是这样。

sixtome 1101

【设计模式(23)】行为型模式之访问者模式

个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道 如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充 生活中,同一类对象会存在不同的元素,每种元素也存在多种不同的逻辑和处理方式。 比如医生开的处方药,医生会给出不同的组合,患者也有不同的剂量和使用方式;电脑中的不同零件,我们需要根据不同的需求进行采购和组合,以及使用; 这些数据结构相对稳定,但访问方式多种多样。 我们可以用访问者模式,把访问方式从数据结构分离出来,并根据需求定制处理方法。进而避免在扩展的时候,修改数据结构。 1.定义 使.

路远不知归 200

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229         今天我们学习如何自定义TextView组件,让它既能显示文本,又能显示图像,达到“图文并茂”的效果。这种情景在新闻、文章、彩信内容中很常见。下面给出该场景的案例: 一、案例技术要点 1.创建attrs.xml文件用于设置自定义组件的属性、类型和样式。

leverli的专栏 2189

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

23种设计模式的JAVA实现——访问者模式(行为型模式)

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

weixin_46903205的博客 239

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Java教程】Day20-23 设计模式:行为型模式——访问者模式

访问者模式(Visitor Pattern)是一种行为型设计模式,它通过将操作从元素结构中抽离出来,允许我们在不修改元素结构的情况下,向其中添加新的操作。访问者模式适用于以下场景:当你希望在不改变对象结构的情况下,向这些对象结构中的元素添加新的操作时,使用该模式能够实现更高的扩展性。

max202011161630的博客 451

23设计模式-访问者模式(行为型模式)

访问者模式 访问者模式将围绕着一个评分系统简介 将来评分分为男生和女生,对歌手进行评测,当看完某一个歌手表演后,得到它们对该歌手不同的评价,评价类型有(成功、失败、等) 传统解决方案 传统解决方案总结 如果系统较小,还是可以使用该方案,但是考虑到系统后期会增加不同的评分类型,或者需要对男生细分成男孩、青年等,整个代码改动就会较大,违法OCP原则 访问者模式解决方案 基本介绍 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下

JolyouLu的博客 180

JAVA设计模式(23):行为型-访问者模式(Visitor)

想必大家都去过医院,虽然没有人喜欢去医院(爱岗敬业的医务工作人员除外,)。在医生开具处方单(药单)后,很多医院都存在如下处理流程:划价人员拿到处方单之后根据药品名称和数量计算总价,药房工作人员根据药品名称和数量准备药品,如图1所示:       在图1中,我们可以将处方单看成一个药品信息的集合,里面包含了一种或多种不同类型的药品信息,不同类型的工作人员(如划价人员和药房工作人员)在操

The Best Or Nothing~ 7890

【23种设计模式】行为型模式(模板方法模式、访问者模式)

22.模板方法模式【Template Methed】 【释义】模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。 利用抽象类特性,抽象方法必须被实现,抽象类可以有已经实现的方法也就是...

随心所欲的博客 350

Java 23种设计模式(21.行为型模式-访问者模式)

Java 23种设计模式(21.行为型模式-访问者模式)

weixin_45428910的博客 163

23种设计模式(23)_行为型_访问者模式(Vistor Pattern)

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。类型:行为类模式。符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的,所以当发生变化时,就可以在不改变元素类本身的前提下,实现对变化部分的扩展。 扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。

heyuchang666的专栏 745

设计模式(23)-行为型-访问者模式(Visitor)

概述 表示一个作用于某对象结构中的各元素的操作。 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。 2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。 Visitor使得你可以将相关

iihero@优快云 3547

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

访问者模式1.访问者模式解决的问题2.访问者模式中的角色3.关系4.例子4.1结构图4.2 抽象数据结构4.3 实际的数据结构4.4 抽象的访问者4.5 实际的访问者4.6 访问者数据分配4.7 结果4.8 增加一个访问者4.9 访问者分配者4.10 结果5.知识点5.1 双重分发5.2 数据与处理分离5.3 开闭原则5.4 扩展 1.访问者模式解决的问题 首先看这样的一个情景: 西游记师徒四人,...

a18792721831的博客 637

【设计模式系列23】设计模式的终极BOSS:访问者模式

访问者模式原理分析前言什么是访问者模式访问者模式示例访问者模式角色访问者模式适用场景访问者模式优缺点总结 前言 设计模式系列到这里已经是23种设计模式的最后一个设计模式了,访问者模式也可以说是所有设计模式中最难的一种设计模式了,当然我们平常也很少会用到它。设计模式的作者是这么评价访问者模式的:大多情况下,你并不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。 什么是访问者模式 访问者模式(Vistor Pattern)是一种将数据结构与数据操作分离的的设计模式。是指封装一些作用于某种数据结构中

zwx900102的博客 3492
上一篇: 【猫厂面试题】——-阿里常问面试题目汇总及答案(JAVA)
下一篇: 【Python】学习笔记——-2.0、Python基础
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值