Design Patterns -- Visitor

Visitor 模式是这个系列文章(也是笔者在读的这本书)的最后一个模式。按惯例,首先给出定义:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

总结一下,这里有两点:1。添加operation 2。不改变原有的classes

事实上,到后面我们会发现要实现上面的两点有一个前提,就是原有的classes里必须有一个传入visitor 的函数。(即在开始设计类时,必须为后面的扩展留出一个冗余的函数。当然,这个函数也可以在子类里再添加。)

看一下类图:

 

这张图比较大,从Client 到ObjectStruture 到Element, 我们可以把这三者合起来作为一个已存在的Hierarchy(classes)。然后就可以看到,在加入Visitor 后,通过Accept 方法的调用,使Visitor 得以进入到Element 内部,接收Element(即,将Element 自身的控制权交给Visitor,比如通过:vistor.VisitConcreteElementB(this))

而《Design Pattern Java Workbook》认为,要较好的运用Visitor 模式,一般需要两点:

1。已有的classes (如Element )使其属性可访问(public )。

2。在Element 内部添加类似Accept 的函数并定义Visitor 。

另外,说到Visitor 模式,不可避免的要说一下 "double dispatch".  假设在Vistor 中有方法accept ( visitorInterface), Client 中有方法visit ( clientInterface). (请注意,这里说visitorInterface 和clientInterface, 意味着继承他们的各有不同的Visitor 和Client. )如图:

。。。(图没法传)

该顺序图大意为:首先Visitor 调用Client 的Accept ( this); 接着Client 的Accept 方法中调用传入Visitor 的 visit (this)。通过着简单的两步,保证了动态调用的 Visitor 是本Client 对应的Vistor。

“double dispatch“ 是Vistor 中比较重要的一点。另外,当Visitor 需要访问的Hierarchy 是一个比较复杂的结构(比如Composite)时,情况也需要更详细的处理。

这里只是简单介绍一些基本的东西,所以上述的内容不做描述,如果有读者有兴趣可以参考给出的参考文献。

 

参考:

http://www.dofactory.com/Patterns/PatternVisitor.aspx

http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=227(笔者认为此文内容有误,仅供参考)

http://www.cs.rice.edu/~cork/Book/node62.html

http://www.cnblogs.com/zhenyulu/articles/79719.html

http://www.cjsdn.net/post/view?bid=17&id=180748&sty=3&age=0 

http://www.cnblogs.com/idior/archive/2006/02/03/325036.html

Codex API 直接集成指南:告别中转代理,构建稳定高效的 AI 应用 在 AI 应用开发中,API 集成是连接模型能力与业务逻辑的核心环节。其基本原理是通过 HTTP 协议,按照服务提供商定义的规范发送请求并解析响应,实现远程调用。标准化的 API 设计确保了跨平台和跨语言的互操作性,其技术价值在于提供了稳定、可控且可扩展的服务接入方式,是构建企业级智能应用的基础。在实际应用场景中,开发者常需集成如 Codex 这类聚合了多种大语言模型的平台,以调用诸如 DeepSeek 等先进模型。然而,部分开发者仍依赖过时的第三方中转代理工具,这不仅引入了单点故障和版本锁定的风险,还可能 阅读详情

相关推荐

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

Design Patterns - Visitor

Visitor(访问者) — 对象行为型模式 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用场景 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作 需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用 Visitor 模式让每个应用仅包含需要用到的操作。 定义对

qq_34921856的博客 547

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6565

Real-Time Design Patterns: Robust Scalable Architecture for Real-Time Systems

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/topmvp - topmvpReal-time programming guru Bruce Powell Douglass collects the best design patterns from this unique, and rapi

TopMVP 866

避开内存陷阱:手把手教你用RKNN零拷贝接口正确管理输入输出Tensor

本文深入解析RKNN零拷贝接口在边缘计算中的高效内存管理策略,通过YOLOX实例演示如何避免内存对齐错误和数据错位。详细介绍了`rknn_tensor_mem`系列API的正确使用方法,包括内存创建、绑定、释放全流程,以及性能优化技巧如内存池技术和多核NPU负载均衡,帮助开发者提升推理效率并避开常见陷阱。

weixin_33686714的博客 160

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 355

学无止境 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)笔记

嵌入式系统是一个旨在处理现实世界中的具体功能的计算机系统,而不是提供通用的计算机环境的系统   工作三年有余,一直在搞嵌入式。准确的说从大学开始就一直在搞,已经到了病入膏肓的地步。此间总是不时出现一些奇怪的想法:人家搞Java、搞C#的动不动就是什么架构/框架的,搞了这么久的的嵌入式,我到底搞了什么?架构/框架?统统木听说过。。。似乎那些高大上的东西都是针对上层编程的!   最近终于静下心来,有功夫读了读Bruce Powel Douglass的”Design Patterns ...

技术干货 1万+

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 507

Design Patterns in ActionScript-Visitor

It’s our winter holiday now, and I spend many times in playing games. In last week, I soaked myself in <Prince of Persia: the sands of time>. I love this game, but it’s a pity for me that when I...

shake863 181

手把手教你用示波器抓取MIPI D-PHY波形:从LP11到HS Burst的完整信号解析

本文详细介绍了使用示波器精准捕获MIPI D-PHY信号的关键技巧,包括探头选择、示波器参数设置、信号状态解析及高级触发配置。通过实战案例和波形分析,帮助工程师快速识别从LP11到HS Burst的各种信号状态,解决常见的信号完整性问题,提升调试效率。

weixin_30471561的博客 562

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3015

大卫的Design Patterns学习笔记23:Vistor

  大卫的Design Patterns学习笔记23:Vistor 一、概述前面已经讨论过的Adapter模式告诉我们如何应对接口不一致对我们的设计造成的影响,但是,这并不能在如下的Context下发挥多大的作用:一个类系中的多个类要求支持相同的操作,但是这些类提供的接口并不一致。看到这里,你可能会说,我干嘛要用什么Adapter?我才没那么笨呢,我直接修改整个类系的接口方法,

大卫的思维空间 2502

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1217

Design Patterns - Visitor Pattern

我之前设想过日志功能,所有的类所有的对象都要记录日志功能,是的,所有的类,所有的对象,并且对于各个不同的类和对象要记录的内容是不一样的,但是记录日志这个功能很明显是属于某类算法,所以我就把它们都放在一个类或者类体系中,这里必须注意,我当然可以调用日志类中某个具体的方法了,但是如果我需要把这些类放在一个集合中,当成一类对象来处理的话,那么访问者模式就要发挥作用了。 In Visitor patter

qq_26847293的博客 354

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Design Pattern - Behavioral Patterns - Visitor Pattern

2007 Section 11, Chapter 3 Visitor Pattern Concept The Visitor pattern allows changes or additions to a class's structure without changing the actual class.

Vincent's Tech Blog 823

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Design Patterns Uncovered: The Visitor Pattern

Today we're going to take a look at the Visitor pattern. Of all of the patterns that I've used so far, Visitor is by far the most powerful and convenient.   Vistors in the Real World  A real wor

Mr.Free的专栏 609

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Visitor(Reference:Design Patterns - Elements of Reusable Object-Oriented Software)

Visitor --- 为对象结构中ConcreteElement的每一个类声明一个Visit操作!该操作的名字和特征标识了发送Visit请求给该访问者的类。使得访问者可以确定正在被访问元素的具体的类。这样访问者就可以通过该元素的特定接口直接访问它。 ConcreteVisitor --- 实现每个由Visitor声明的操作。每个操作实现本算法的一部分,该算法是对应于结构中对象的类。Conc...

jhgsdaxkakjskndf的博客 205

【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)

我们有一个调制解调器类的层次结构。需要使用基于过滤条件的外部算法(是Unix或DOS兼容的调制解调器)来访问此层次结构中的调制解调器。非循环访客模式允许将新功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会创建四人帮访客模式中固有的循环依赖问题。如果子类需要覆盖(重写)父类的方法,那么子类的方法参数、返回类型和异常处理等要与父类方法保持一致,以确保可以无缝替换。允许将新功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会有四人帮访客模式中那样循环依赖的问题。

CSBIGDOG的博客 1669

Visitor(Chapter 15 of Pro Objective-C Design Patterns for iOS)

The Visitor pattern represents an operation to be performed on the elements of an objectstructure. Visitor lets you define a new operation without changing the classes of the elements onwhich it op...

weixin_30252709的博客 117

Design Pattern: Visitor 模式

在Java中所有的物件都继承自Object物件,这样作的优点之一,就是使得一些集合物件的资料结构容易管理,例如您可以将任何型态的物件放入Vector中。然而现在有个问题是,如果您的集合(connection)物件中不仅储存一种型态的物件,如果想要对这些物件作出一些个别化的操作,首要条件就是要知道该物件的型态,使用 instanceof 似乎是个不错的方式,在程式简单的情况下,也许您会这么作: ...

Chinaxxren 350

DesignPatterns_Visitor

//////////////////////////////////////////////////////////////////////////////////// // Visitor pattern // - Represent an operation to be performed on the elements of an object structure. // Visi

头像是我的偶像的专栏 639

CppCon 2024 学习:Many Ways to Kill an Orc (or a Hero)

我们的游戏程序员和游戏引擎,经常会涉及到英雄与敌人之间的战斗。 这是一个情境设定,并不是技术点本身,而是为后面的内容服务。表达英雄和怪物互相战斗, 传统上(classical / traditional)已经有很多常见、固定的写法。 但是—— C++ 是一门表达能力非常强、非常灵活的语言。 这里的“classical”暗指:而随着 C++20 / C++23 的到来, 英雄和怪物“互相攻击”的实现方式变得更多了。 这是一个明显的铺垫,暗示后面会涉及:到现在为止,你可能在想:……所以,不,这其实并不是这场演讲

虾球 931

Design Pattern_Visitor(访问者模式)

参考jdon:http://www.jdon.com/designpatterns/visitor.htm 访问者模式最重要的一点就是将判断语句用接口实现了,推迟到visitable中,由子类决定visitor调用那个方法

布莱克洛 609

C语言对话-5.通过任何其他名字

啊,”我想起来了,“所以当我编写多态地使用了Personnel派生的对象的代码时,只需调用Personnel::Accept(myVisitorObject)。当然,在飞船中的任何地方都可以看到更好的景色,但当看到真实、原原本本的光直接从月球反射进你的眼睛时,总能有一丝特殊的感觉。“我不喜欢这样,”我对自己,也对别人这样说:“但这一次,我觉得有充足的理由让他们更改这个规范。“是的,”我再次打断,渴望表现出自己确实懂一些东西,“他们应该创建一个以Fruit为基类的类体系,然后派生Apple和Orange。

qq_41237850的博客 906

设计模式学习—访问者模式(Visitor Design Pattern)

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

闲鱼的博客 886

Design Patterns Elements of Reusable Object-Oriented Software(一)Introduction(介绍)

1.Introduction(介绍) Designing object-oriented software is hard,and designing reusable object-oriented software is even harder.You must find pertinent objects, factor them into classes at the rightgran

liuzuyi200的专栏 4790
上一篇: Design Patterns -- Visitor
下一篇: Spring配置文件中SessionFactory引用Hibernate配置产生问题的思考
dr2tr
博客等级 码龄24年 28粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值