设计模式: 行为型之访问者模式(22)

c#代码介绍23种设计模式_22访问者模式 访问者模式是封装一些施加于某种数据结构之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变。访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变。数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做“双重分派”。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。 阅读详情

访问者模式概述

  • 访问者模式(Visitor Pattern)是一种行为设计模式,它封装了一些作用于某种数据结构各元素的操作
  • 可以在不改变数据结构的前提下定义作用于这些元素的新的操作
  • 访问者模式适用于需要对一个对象结构中的对象进行很多不同操作
  • 同时需要避免让这些操作“污染”这些对象的类

访问者模式应用

// 元素接口  
interface ElementX {  
    accept(visitor: Visitor): void;  
}  
  
// 具体元素A  
class ElementA implements ElementX {  
    accept(visitor: Visitor) {  
        visitor.visitElementA(this);  
    }  
  
    operationA() {  
        console.log("ElementA operation");  
    }  
}  
  
// 具体元素B  
class ElementB implements ElementX {  
    accept(visitor: Visitor) {  
        visitor.visitElementB(this);  
    }  
  
    operationB() {  
        console.log("ElementB operation");  
    }  
}  
  
// 访问者接口  
interface Visitor {  
    visitElementA(elementA: ElementA): void;  
    visitElementB(elementB: ElementB): void;  
}  
  
// 具体访问者  
class ConcreteVisitor implements Visitor {  
    visitElementA(elementA: ElementA) {  
        elementA.operationA();  
        console.log("Visited ElementA");  
    }  
  
    visitElementB(elementB: ElementB) {  
        elementB.operationB();  
        console.log("Visited ElementB");  
    }
}

// 使用示例
function main() {
    const elementA = new ElementA();
    const elementB = new ElementB();
  
    const visitor = new ConcreteVisitor();
  
    elementA.accept(visitor); // 输出: ElementA operation 和 Visited ElementA
    elementB.accept(visitor); // 输出: ElementB operation 和 Visited ElementB
}  
  
// 运行客户端代码  
main();
  • 在这个例子中,ElementA 和 ElementB 是实现了 accept 方法的元素对象
  • 它们接受一个 Visitor 对象作为参数,并调用相应的访问方法
  • ConcreteVisitor 是具体的访问者类,它实现了 Visitor 接口,并为每个元素类型提供了具体的访问逻辑
  • 在 main 函数中,我们创建了 ElementA 和 ElementB 的实例,以及一个 ConcreteVisitor 的实例
  • 然后,我们调用每个元素的 accept 方法,并将访问者传递给它
  • 这导致访问者执行相应的操作,并打印出访问了哪个元素
  • 这个示例展示了访问者模式的核心概念:元素对象通过接受访问者对象来执行操作,而不是直接包含这些操作
  • 这使得我们可以在不修改元素类的情况下添加新的操作
  • 同时,通过将操作逻辑集中在访问者中,我们实现了操作与元素结构的解耦,从而提高了系统的灵活性和可维护性
  • 需要注意的是,访问者模式并不总是必要的
  • 它通常在需要为对象结构中的元素添加大量新的操作时很有用,尤其是当这些操作不适合放在元素类中时
  • 然而,如果元素结构是稳定的,或者操作与元素紧密相关,那么引入访问者模式可能会增加不必要的复杂性
  • 在设计系统时,应权衡其优缺点,并根据具体情况做出决策

访问者模式应用场景

  • 访问者模式是一种行为设计模式,它允许你在不修改对象结构的前提下为对象添加新的操作
  • 以下是访问者模式的一些应用场景
    • 博物馆导览员:博物馆中的艺术品、展品等可以被看作是元素,而导览员则是具体访问者。导览员可以根据参观者的需求,为他们提供不同的讲解、信息或故事,而不需要改变艺术品本身
    • 旅游团队:在这个场景中,导游可以被看作是访问者,而游客可以被视为元素。导游可以根据游客的兴趣和需求,提供不同的旅游信息和体验,而不需要修改景点本身
    • 电商网站的商品分类:电商网站的商品,如数码产品、服装鞋帽、家居用品等,可以被看作是元素。访问者对象(例如用户或搜索算法)可以访问不同类型的商品对象,并基于商品的价格、品牌等属性执行不同的操作,如排序、筛选等
    • 汽车修理厂的维修工:维修工是访问者,可以访问不同类型的汽车对象(如小轿车、越野车、卡车等),并基于汽车的具体类型执行相应的维修操作
    • 文档解析:在文档处理中,文档结构包含多种类型的元素,如文本、图片和表格。访问者模式可以用来实现文档的渲染、格式校验或者内容提取等操作
    • 保险评估:对不同类型的保险单执行风险评估和报价时,每种保险单都有不同的风险评估算法。通过访问者模式,可以灵活地为不同类型的保险单实现风险评估
    • 公园管理系统:一个公园包含多种类型的景点,如游乐场、植物园和博物馆。访问者模式可以用来实现不同访客对不同景点的不同访问行为,例如儿童、成人和园艺师可以有不同的访问方式和体验
  • 在这些场景中,访问者模式的核心优势在于它允许我们在不改变元素本身的情况下为元素执行不同的操作
    • 这种分离关注点的设计模式使得系统更加灵活,可以更容易地扩展和修改操作,而无需修改元素的结构或类
    • 然而,需要注意的是,访问者模式可能会增加系统的复杂性,因此在决定使用它之前,需要仔细权衡其优缺点

访问者模式优缺点

  • 访问者模式是一种行为设计模式,它允许你在不修改对象结构的前提下为对象添加新的操作

1 ) 优点

  • 扩展性好:访问者模式使得在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能成为可能。当需要添加新的操作或者新的访问者时,不需要修改已有元素类的代码,只需要添加新的访问者类即可
  • 复用性好:通过访问者来定义整个对象结构通用的功能,可以提高系统的复用程度。因为访问者类封装了操作,可以在不同的元素间复用相同的操作逻辑
  • 灵活性高:访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可以相对自由地演化而不影响系统的数据结构。这意味着可以独立地修改和扩展操作,而不需要修改元素类
  • 符合单一职责原则:访问者模式将相关的行为封装在一起,构成访问者,使每个访问者的功能都比较单一。这有助于保持代码的清晰和可维护性

2 )缺点

  • 增加新的元素类困难:在访问者模式中,每增加一个新的元素类,都需要在每个具体访问者类中增加相应的具体操作。这违背了“开闭原则”,即软件实体应当对扩展开放,对修改封闭
  • 破坏封装性:访问者模式中,具体元素需要向访问者公开其内部细节,这可能会破坏对象的封装性。因为访问者需要访问并调用每一个节点对象的操作,这要求节点对象暴露一些操作和内部状态
  • 违反依赖倒置原则:访问者模式通常依赖于具体类而不是抽象类。这可能导致代码与具体实现紧密耦合,降低了系统的灵活性和可维护性
  • 不适用于经常变化的对象结构:如果对象结构中的类经常变化,使用访问者模式可能会导致大量的修改工作,因为每当对象结构发生变化时,访问者的接口和实现都需要相应地进行调整

3 ) 总结

  • 综上所述,访问者模式在需要为对象结构添加新的操作且不希望修改对象结构本身时非常有用
  • 然而,它也有一些缺点,特别是在需要频繁修改对象结构或保持高度封装性的情况下
  • 因此,在选择是否使用访问者模式时,需要仔细权衡其优缺点,并根据具体的应用场景做出决策
C++ 设计模式23:访问者模式 访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于将数据结构与数据操作分离。访问者模式允许在不修改现有数据结构的情况下,向对象结构中添加新的操作。这种模式主要包括访问者(Visitor)和被访问元素(Element)两个主要组成部分。访问者模式的主要优点是增加新的操作变得容易,因为不需要改变对象结构。同时,它也有一些缺点,如访问者模式使得对象结构变得不易修改,而且可能会破坏封装。 阅读详情

相关推荐

【简易设计模式22】访问者模式

第74篇出过书的朋友都知道,对于你出的一本书,不同类型的读者会给你不同的反馈,因为他们看到了不同的层次,读到了不同的味道。这里的读者和书是两类事物,他们虽有联系,却是比较弱的联系,我们可以将其分开处理,这种方式在程序中称作访问者模式。读者就是访问者,书是被访问的对象,阅读就是访问行为。本篇将详细梳理访问者设计模式。1.访问者模式的概念访问者模式(Visitor Pattern) 也是相对简单的模式...

实战开发者Airex 161

D22:C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是【访问者模式】,英文名称是:Visitor Pattern。如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的信息,而且这个模式在我们的编码生活中使用的并不是很多。该模式的意图定义很抽象,第一次看了这个定义其实和没看没有什么区别,一头雾水,为了让大家更好的理解该模式的初衷,我们举个例子来说明模式。比如:...

. 513

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

设计模式 22 访问者模式 Visitor Pattern

访问者模式是一种行为型设计模式,它允许你在不改变已有类结构的情况下,为一组对象添加新的操作。它将算法与对象结构分离,使你能够在不修改现有类的情况下,为这些类添加新的操作。访问者模式是一种强大的设计模式,但需要谨慎使用。在实施访问者模式时,需要仔细考虑元素接口和访问者接口的设计,以及具体访问者类的实现。同时,需要了解访问者模式的局限性,并选择合适的应用场景。

jxusthusiwen的专栏 1306

MacOS多次踩坑后成功安装Homebrew

来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下

weixin_41847116的博客 1983

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

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

访问者模式(Visitor Pattern)属于行为型设计模式,它允许在不修改现有对象结构的前提下,定义对这些对象执行操作的新操作。访问者模式将数据结构和操作分离,使得操作可以独立变化。访问者模式基本思想是,针对系统中拥有固定类型数的对象结构(元素),在其内提供一个 accept()方法来接受访问者对象的访问。不同的访问者对同一个元素的访问内容是不同,使得相同的元素集合可以产生不同的数据结果。

tszc95的博客 2609

MMRotate 详细使用教程

MMRotate 详细使用教程 做旋转目标检测,怎么可以不知道如何使用MMRotate呢! github链接: https://github.com/open-mmlab/mmrotate 1 安装 创建虚拟环境并激活 conda create -n mmrotate python=3.7 -y conda activate mmrotate 安装 PyTorch 和 torchvision conda install pytorch torchvision -c pytorch 注意:确保

Sylvia_Lan的博客 1万+

【设计模式22】访问者模式

访问者模式是一种将数据结构与数据操作解耦的设计模式,适用于数据结构稳定但操作多变的场景。本文以财务系统为例,展示了不同角色(CEO、财务经理、审计师)对财务报表数据的差异化分析需求。通过定义访问者接口(FinancialAnalyst)和被访问者接口(FinancialStatement),实现了在不修改报表类的情况下扩展分析功能。具体实现中,每个角色作为具体访问者(如CEOAnalyst)实现自己的分析逻辑,而报表类(如IncomeStatement)通过accept方法接受访问者并调用对应的visit方

专注后端技术架构,AI技术分享 781

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

保姆级教程:用MATLAB搞定双目相机标定,从导入图片到参数解读全流程

本文提供了一份详细的MATLAB双目相机标定全流程指南,涵盖从图片准备到参数解读的每个环节。重点讲解了棋盘格选择、拍摄技巧、MATLAB工具箱设置及参数优化,帮助读者避免常见错误并提升标定精度。特别适合机器人导航、三维重建等领域的开发者。

weixin_33737134的博客 430

设计模式第22讲——访问者模式(Visitor)

访问者模式是一种行为型设计模式,它可以用于在不修改已有对象结构的情况下,定义新的操作方式。一、什么是访问者模式 二、角色组成 三、优缺点 四、 应用场景 4.1 生活场景4.2 Java场景 五、代码实现 5.0 UML类图5.1抽象访问者——Visitor5.2 具体访问者——Tourist5.3 抽象元素——Spot5.4 具体元素——View、Relic5.5 对象结构——SpotCollection5.6 testVisitor六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 3137

【020】C++ 动态内存管理解析:new 和 delete 的正确使用

C++中的动态内存分配是在程序运行时根据需要进行内存空间的分配和释放,与静态内存分配相比,具有更大的灵活性和适应性。动态内存分配可以通过new和delete或者malloc()和free()等函数实现。在程序运行时无法确定所需的内存大小。需要在多个函数之间共享数据,并且数据可能被频繁地创建和销毁。静态数组无法满足需求,例如需要支持可变长度数组。如果在动态分配内存后忘记了释放它,则会导致内存泄漏。为避免内存泄漏,可以使用智能指针或手动管理内存的方式来释放动态分配的内存。

Lion_Long的博客 1471

22种设计模式——访问者模式

文章目录1. 概述2. 特点3. 实现 1. 概述 2. 特点 3. 实现

meiziziLOLOLO的博客 310

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 280

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JAVA设计模式之 访问者模式【Visitor Pattern】

一、概述     访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为“对象结构”,访问者通过遍历对象结构实现对其中存储的元素的逐个操作。访问者模式是一种对象行为型模式。 二、适用场景

小吕丶Code阶区 6090

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

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

设计模式-22-访问者模式

一、访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 封装一些作用于某中数据结构中的各个元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作 二、介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需

weixin_46147113的博客 173

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java 22种设计模式详解

设计模式通常分为三类:创建型(Creational),结构型(Structural)和行为型(Behavioral)。设计模式可以看作是程序设计的经验总结,它们可以提高代码的可维护性、可扩展性、和复用性。在实际的软件开发中,设计模式经常会被结合起来使用,来解决复杂的设计问题。这类模式专注于如何创建对象或类的实例。单例模式的目的是确保一个类只有一个实例,并提供一个全局访问点。下面是一个线程安全的单例模式实现,采用“双重检查锁定”(Double-Checked Locking)方案。这种方案在多线程环境下可以保

ALONG的博客 2257

22. 访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern) 是一种行为型设计模式,它允许你在不修改元素类的前提下,添加新的操作。访问者模式通过将操作封装在访问者对象中,从而使得你可以为不同类型的元素执行不同的操作,而不需要改变元素类的代码。// 访问者接口public:ShapeVisitor 是访问者接口,声明了访问不同元素的方法。每个具体访问者会实现这些方法,针对不同的图形执行不同的操作。// 元素接口public:// 接受访问者。

Tiantangbujimo7的博客 820

2024050901-重学 Java 设计模式《实战访问者模式》

访问者要解决的核心事项是,在一个稳定的数据结构下,例如用户信息、雇员信息等,增加易变的业务访问逻辑。为了增强扩展性,将这两部分的业务解耦的一种设计模式。说白了访问者模式的核心在于同一个事物不同视角下的访问信息不同,比如一个美女手里拿个冰激凌。小朋友会注意冰激凌,大朋友会找自己喜欢的地方观测敌情。// 基础用户信息// 姓名// 身份;重点班、普通班 | 特级教师、普通教师、实习教师// 班级// 核心访问方法基础信息包括;姓名、身份、班级,也可以是一个业务用户属性类。

qq_24428851的博客 1223

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

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

随心所欲的博客 350

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

摘要: 访问者模式是一种行为设计模式,用于分离对象结构与操作逻辑。它适用于对象结构稳定但操作频繁变化的场景,如编译器对语法树的不同处理。该模式通过Visitor接口定义访问方法,由具体访问者实现不同操作,元素类通过accept方法接受访问者调用。示例展示了图形对象(点、圆、矩形)的面积和周长计算,演示了如何在不修改元素类的情况下扩展新操作。访问者模式解决了数据与算法的耦合问题,但可能降低代码可读性,应谨慎使用。该模式适合需要跨类层次执行统一操作或频繁添加新操作的场景。

不开心就吃辣 833

Java设计模式 -22- 访问者模式(Visitor 模式)

Java设计模式 -22- 访问者模式(Visitor 模式)前言 前言 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下 11

Android系统工程师--小馬佩德罗 880

每天记录学习的新知识 :Android 设计模式之行为型

文章目录前言创建型行为型结构型行为型设计模式学习6. 策略模式7. 状态模式8. 观察者模式9. 中介者模式10. 访问者模式11. 迭代器模式12. 模板方法13. 备忘录模式14. 命令模式15. 解释器模式16. 职责链模式 前言 Android 的设计模式分为3大类,一个23种。 创建型 单例模式; 2. Builder模式; 3. 原型模式; 4. 工厂方法; 5. 抽象工厂 行为型 策略模式; 7. 状态模式; 8. 观察者模式; 9. 中介者模式; 10.

嗯... 471

Golang设计模式——09访问者模式

package Visitor import "fmt" type IVisitor interface { Visit() } type WeiBoVisitor struct { } func (w WeiBoVisitor) Visit() { fmt.Println("visit weibo") } type IQIYIVisitor struct { } func (I IQIYIVisitor) Visit() { fmt.Println("visit iqiyi") } ty

清风 714

[0722].第22节.访问者模式

1.访问者模式(Visitor)是一种操作一组对象的操作,它的目的是不改变对象的定义,但允许新增不同的访问者,来定义新的操作。比如基于访问者模式的一个简单示例在线购物车:假设您有不同的商品,如书籍、电子产品和服装。每件商品都可以接受执行诸如计算总价或应用折扣等操作的访客。这样,您可以在不更改商品类别的情况下添加新功能,从而使系统更易于维护和更新。2.访问者模式主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题在被访问的类里面加一个对外提供接待访问者的接口。

F-T-er 1166
上一篇: 设计模式: 行为型之中迭代器模式(21)
下一篇: 设计模式: 行为型之解释器模式(23)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值