设计模式——访问者

手把手教你设计2bit反射型超表面:从单patch扫参到pin管配置全流程 本文提供了一份2bit反射型超表面设计的完整工程实践指南。从单贴片谐振器的参数化扫描与“270度法则”应用,到PIN二极管等效电路模型的获取与集成,再到利用参数化扫描高效仿真四种工作状态,手把手指导读者完成从单元设计到阵列布局、偏置线集成及加工考量的全流程,旨在帮助射频工程师将概念转化为可加工测试的实体模型。 阅读详情

VISITOR访问者

1、 意图

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

2、 适用性

在下列情况下使用visitor模式:

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

3、 结构


4、 参与者

Visitor(访问者)

——为该对象结构中ConcreteElement的每一个类声明一个Visit操作。该操作的名字和特征标识了发送Visit请求给该访问者的那个类。这使得访问者可以确定正被访问元素的具体类。这样访问者就可以通过该元素的特定接口直接访问它。

ConcreteVisitor(具体访问者)

——实现每个由Visitor声明的操作。每个操作实现本算法的一部分,而该算法片段是对应于结构中对象的类。ConcreteVisitor为该算法提供了上下文并存储它的局部状态。这一状态常常在遍历该结构的过程中积累的结构。

Element(元素)

——定义一个Accept操作,它以一个访问者为参数。

ConcreteElement(具体元素)

——实现Accept操作,该操作以一个访问者为参数。

ObjectStruccture(对象结构)

——能枚举它的元素。

——可以提供一个高层的接口以允许该访问者访问它的元素。

——可以是一个复合。

5、 协作


1)  一个使用Visitor模式的客户必须创建一个ConcreteVisitor对象,然后遍历该对象结构,并用该访问者访问每一个元素。

2)  当一个元素被访问时,它调用对应于它的类的Visitor操作。如果必要,该元素将自身作为这个操作的一个参数以便该访问者访问它的状态。

6、 效果

1)  访问者模式使得易于增加新的操作。

2)  访问者集中相关的操作而分离无关的操作。

3)  增加新的ConcreteElement类很难。Visitor模式使得难以增加新的Element的子类。每添加一个新的ConcreteElement都要在Visitor中添加一个新的抽象操作,并在每一个ConcreteVisitor类中实现相应操作。

4)  通过类层次进行访问。

5)  积累状态。当访问者访问对象结构中的每一个元素时,它可能会累积状态。如果没有访问者,这一状态将作为额外的参数传递给进行遍历的操作,或者定义为全局变量。

6)  破坏封装。

7、 实现

1)   双分派。访问者模式允许你不改变类即可有效地增加其上的操作。为达到这一效果使用了双分派(double-dispatch)的技术。双分派意味着得到执行的操作决定于请求的种类和两个接收者的类型。Accept是一个double-dispatch操作。它的含义决定于两个类型:Visitor的类型和Element的类型。双分派使得访问者可以对每一个类元素请求不同的操作。

这是Visitor模式的关键所在:得到执行的操作不仅决定于Visitor的类型还决定于它访问的Element的类型。可以不将操作静态地绑定在Element接口中,而将其安放在一个Visitor中,并使用Accept在运行时进行绑定。扩展Element接口就等于定义一个新的Visitor子类而不是多个新的Element子类。

2)  谁负责遍历对象结构。一个访问者必须访问这个对象结构的每一个元素。我们可以将遍历的责任放到下面三个地方中的任意一个:对象结构中,访问者中,或一个独立的迭代器对象中。通常由对象结构负责迭代。一个集合只需对它的元素进行迭代,并对每一个元素调用Accept操作。而一个复合通常让Accept操作遍历该元素的各子构件并对它们中的每一个递归调用Accept。

另一种解决方案就是使用一个迭代器来访问各个元素。

8、 代码示例

 Visitor

package com.examples.pattern.visitor;

/**
 * 访问者接口
 */
public interface Visitor {

	/**
	 * 访问元素A,相当于给元素A添加访问者的功能。
	 * @param elementA 元素A的对象
	 */
	public void visitConcreteElementA(ConcreteElementA elementA);
	
	
	/**
	 * 访问元素B,相当于给元素B添加访问者的功能。
	 * @param elementB 元素B的对象
	 */
	public void visitCOncreteElementB(ConcreteElementB elementB);
}

ConcreteVisitor

package com.examples.pattern.visitor;

/**
 * 具体访问者的实现
 */
public class ConcreteVisitorA implements Visitor {

	@Override
	public void visitConcreteElementA(ConcreteElementA elementA) {
		//把要访问ConcreteElementA时,需要执行得到功能实现在这里
		//可能需要访问元素已有的功能。
		elementA.opertionA();
	}

	@Override
	public void visitCOncreteElementB(ConcreteElementB elementB) {
		elementB.opertionB();
	}

}
package com.examples.pattern.visitor;

/**
 * 具体访问者的实现
 */
public class ConcreteVisitorB implements Visitor {

	@Override
	public void visitConcreteElementA(ConcreteElementA elementA) {
		// 把要访问ConcreteElementA时,需要执行得到功能实现在这里
		// 可能需要访问元素已有的功能。
		elementA.opertionA();
	}

	@Override
	public void visitCOncreteElementB(ConcreteElementB elementB) {
		elementB.opertionB();
	}

}
Element

package com.examples.pattern.visitor;

/**
 * 被访问的元素的接口
 */
public abstract class Element {

	/**
	 * 接受访问者的访问
	 * @param visitor 访问者对象
	 */
	public abstract void accept(Visitor visitor);
	
}

ConcreteElement

package com.examples.pattern.visitor;

/**
 * 具体元素的实现
 */
public class ConcreteElementA extends Element {

	@Override
	public void accept(Visitor visitor) {
		//回调访问者对象的相应方法
		visitor.visitConcreteElementA(this);
	}
	
	public void opertionA(){
		System.out.println("this is operation A");
	}

}
package com.examples.pattern.visitor;

/**
 * 具体元素的实现对象
 */
public class ConcreteElementB extends Element {

	@Override
	public void accept(Visitor visitor) {
		//回调访问者对象的相应方法
		visitor.visitCOncreteElementB(this);
	}
	
	public void opertionB(){
		System.out.println("this is operation B");
	}

}
ObjectStruccture

package com.examples.pattern.visitor;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 对象结构,通常在这里对元素对象进行遍历,让访问者能访问到所有的元素
 */
public class ObjectStructure {
	
	/**
	 * 示意,表示对象结构。可以是一个组合结构或是集合。
	 */
	private Collection<Element> col = new ArrayList<Element>();
	
	/**
	 * 提供给客户端操作的高层接口
	 * @param visitor 客户端需要使用的访问者
	 */
	public void handleRequest(Visitor visitor){
		//循环对象结构中的元素,接受访问
		for(Element ele : col){
			ele.accept(visitor);
		}
	}
	
	/**
	 * 组件对象结构,向对象结构中添加元素
	 * @param ele 加入到对象结构的元素
	 */
	public void addElement(Element ele){
		this.col.add(ele);
	}
	

}
Client

package com.examples.pattern.visitor;

public class Client {
	
	public static void main(String[] args) {
		
		//创建ObjectStruccture
		ObjectStructure os = new ObjectStructure();
		//创建要加入对象结构的元素
		Element eleA = new ConcreteElementA();
		Element eleB = new ConcreteElementB();
		//把元素加入对象结构
		os.addElement(eleA);
		os.addElement(eleB);
		//创建访问者
		Visitor visitor = new ConcreteVisitorA();
		os.handleRequest(visitor);
		
	}

}

9、 相关模式

Composite:访问者可以用于对一个由Composite模式定义的对象结构进行操作。

Interpreter:访问者可以用于解释。

全新DEIM有效涨点改进目录 | 本专栏持续更新500+篇内容 | 包含各种顶会顶刊卷积、注意力、特征融合模块、有效特征聚合提取模块,上采样模块、下采样模块,二次创新模块、独家创新等几百种创新点改进 🚀【CVPR2025DEIM改进专栏速览】🔥 专栏提供500+篇目标检测创新改进方案,涵盖卷积/注意力/特征融合等创新改进点,均源自顶会论文及实战经验。支持多领域应用(工业/医疗/遥感等),配套完整教程和答疑服务。亮点包括: 1️⃣ 持续更新SOTA模型改进方案 2️⃣ 小白友好型实验操作指南 3️⃣ 跨学科科研支持(已助非计算机专业发表论文) 4️⃣ 提供虚拟环境配置方案。 订阅可获完整项目代码及交流群服务,适合研究生科研论文改进需求。价格呈上涨趋势,早订更优惠! 阅读详情

相关推荐

【阅读文献笔记】FoundationStereo: Zero-Shot Stereo Matching

提出首个零样本泛化立体匹配基础模型设计 STA 模块融合单目先验提出 AHCF 模块增强代价滤波构建 100 万合成数据集 FSD + 自净化流程。

qq_46460379的博客 1257

设计模式-访问者模式-Visitor Design Pattern

这是一种行为设计模式。它管理对象之间的算法、关系和责任。它用于在运行时对一组类似的对象执行操作。它将操作与对象结构解耦。使用访问者模式,我们可以在不改变现有代码的情况下轻松地向现有的类层次结构添加新的行为。有时,它也被称为行为模式(behavioral pattern)。访问者模式的主要目标是将操作逻辑从对象移动到另一个类中。使用访问者模式,我们可以实现开闭原则。根据GoF,访问者设计模式被定义为:访问者模式是一种操作对象结构中元素的操作方法。它允许您定义一个新的操作,而。

Java程序员的知识博客 1354

短视频团队架构&工作流程---2025.3.30

1、负责短视频日常内容分发上线,包括视频头图、标题、简介、推荐位及部分内容元数据的日常导入、审核、上线、下线,并提供各品类短视频的内容上线计划表。(20)运营:视频推送后,实时跟进视频数据,定期统计分析数据报表,根据数据表现 找到问题,并发送给各个小组的负责人,对下一期视频内容进行调整。(4)运营:收到成片,设计视频头图、标题、简介、推荐位等,分发到各个平台,统计分析视频的数据,对各个平台的视频进行管理、用户互动等。1、负责影视、戏剧、广告、专题片等的策划、组稿选题、材料收集、内容策划。

超越神明 2151

Design Pattern Visitor 访问者设计模式

访问者设计模式是已经有了一组Person对象了,然后不同的访问者访问这组对象,会有不同效果。 这些访问者实际上就是一个可以让Person对象组执行的动作行为等。 至于这些Person对象是如何执行这些访问者的动作的,那是已经在特定的不同的Person对象中设计好的。 比如我们的访问者也许是一些动作集合的类,如: class Action { public: string present;

靖空间 1053

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 507

【网络与爬虫 61】移动端App爬虫终极指南:Android-iOS应用数据提取黑科技全解析

本文全面解析移动端App爬虫技术,涵盖Android和iOS两大平台的数据提取方法。从基础的网络抓包到高级的代码注入,从自动化测试框架到反调试技术绕过,为开发者提供移动端数据采集的完整解决方案和实战经验。

熵数实验室 3023

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

 Visitor Design Pattern(访问者设计模式)实现要点:所有被访问的对象必须继承一个带有accept(IVisitor)方法的接口;被访问对象的accept方法的具体实现:visitor.visit(this), 把自己的对象暴露给visitor;访问的对象通过实现IVisitor接口,对不同的被访问对象子类进行不同的操作。 好处:1,分散在不同子类相同的功能被集中管理在一种Vi...

芝麻开花 437

VisionPro 机器视觉案例 之 彩色保险丝个数统计

CogColorSegmenterTool CogColorMatchTool

机器视觉李小白的博客 2352

20【访问者设计模式】

访问者设计模式(Visitor Pattern):是一种将数据结构与数据操作分离的设计模式,该模式封装一些作用于操作其内部的数据的步骤,可以在不改变数据结构的前提下定义作用于这些元素的新操作;生活中的访问者模式场景也非常多;如:一个家庭中有非常多的成员,如孩子、父亲、母亲等;这些家庭成员都有非常多的一些属性/行为,作为访问者的我们(丈夫、妻子)都可以去对家庭成员的信息进行访问,但是不同的角色访问的感兴趣的内容是不一样的;例如丈夫关心孩子的兴趣爱好、平时的生活信息,关心父母的饮食、社会生活等;

緑水長流*z 1150

【ArcGIS微课1000例】0068:ArcGIS加载world imagery高清卫星影像教程

本文介绍了如何在ArcGIS中加载World Imagery高清卫星影像作为谷歌影像的替代方案。通过添加ArcGIS Server并输入在线图集URL(https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer),即可连接并预览包含中国影像、青海湖、东方明珠等全球高清卫星图。该教程提供了详细的操作步骤图示,帮助用户快速获取优质底图数据,适用于地理信息分析和可视化应用。

智慧空间实验室 5416

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

设计模式---访问者模式(DesignPattern_Visitor)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 103

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

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

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

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

一个码农的博客 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

lwip-2.0.3

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

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

访问者设计模式是一种行为型设计模式,用于将算法与对象结构分离。它允许你在不改变对象结构的前提下定义新的操作。

weixin_44251099的博客 423

蓝牙模块HM-10手册

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

设计模式之访问者

(Visitor) 是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。适用场景代码如下:问题:做一款生成冰激凌和雪糕的程序,要求可以扩展新的口味,并且可以扩展新的包装方式。解决方案:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

qq_74811378的博客 1383

DesignPattern-访问者模式

基本思想: 系统中拥有一个or许多对象构成,比较稳定的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个visit方法,这个方法访问到的对象结构中不同类型的元素做出不同的处理。 精髓: 封装一些作用于某种数据结构中各元素的操作,它可以在不改变这个数据结构的前提下定义作用域这些元素的新的操作。 有这么一个操作,它是作用域一些元素之上的,而这些元素属...

其实我也没有太多期盼,毕竟一生太短,少有圆满 214

java设计模式:访问者模式

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。

pscool的博客 1196

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

访问者设计模式是一种行为型设计模式,它将数据结构与作用于结构上的操作解耦,允许在不修改数据结构的前提下增加新的操作行为。该模式包含关键角色如元素接口、具体元素类、访问者接口和具体访问者类。通过访问者模式,可以在不改变对象结构的情况下,定义新的操作行为。文章通过示例场景和类图、时序图等详细介绍了访问者设计模式的结构和实现方式,并探讨了其适用场景和实战示例。

庄小焱 1422

【设计模式】访问者模式

【设计模式】访问者模式——行为型模式。封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。以上就是设计模式之访问者模式【行为型模式】的相关知识点,希望对你有所帮助。积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

浩泽学编程的博客 1744

访问者设计模式

访问者设计模式: ##被访问者: 有一些稳定的结构对象,提供accept方法供访问者进行访问 ##访问者: 一些访问者,有一个visitor方法实现对对象的访问,不同的对象会做出不同的反应! ##应用 公司年终奖考核: 被访问者有:程序员,产品经理(accept(Visitor)) 访问者:CEO,CTO(visit(…)) CEO可能只会关注KPI,CTO可能只会关注程序员的KPI+代码量,产品...

itheimach的专栏 300

23种设计模式之访问者模式(Visitor Pattern)

本篇文章将23种设计模式中的访问者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

设计模式之访问者模式

访问者模式,即在不改变聚合对象内元素的前提下,为聚合对象内每个元素提供多种访问方式,即聚合对象内的每个元素都有多个访问者对象。访问者模式主要解决稳定的数据结构和易变元素的操作之间的耦合问题。变量被声明时的类型叫做变量的静态类型,又称为明显类型;而变量所引用的对象的真实类型叫做变量的实际类型。如 Map map = new HashMap(),map 变量的静态类型是 Map,实际类型是 HashMap。根据对象的类型对方法进行选择,就是分派,即 Dispatch,分派又分

后端为主,前端为辅。 2593

23种设计模式-访问者(Visitor)设计模式

23种设计模式-访问者(Visitor)设计模式

Hanson的博客 1629

设计模式——访问者模式

访问者模式(Visitor Pattern)是一种行为设计模式。它表示一个作用于某对象结构中的各元素的操作。它允许你在不改变这些元素的类的前提下定义作用于这些元素的新操作。例如,考虑一个包含多种图形(如圆形、矩形)的绘图系统。如果要对这些图形进行多种操作(如计算面积、绘制轮廓等),可以使用访问者模式。不用在每个图形类中添加各种操作方法,而是将操作封装成独立的访问者类,让这些访问者类去访问图形对象并执行相应的操作。

chuliling0446的博客 1139
上一篇: 设计模式——桥接模式
下一篇: Office2007文件在IE8下,下载为zip文件
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值