设计模式-15访问者模式

【设计模式】——访问者模式(Visitor Pattern) 访问者模式(Visitor Pattern)是一种行为型设计模式,用于在不改变现有对象结构的情况下,定义对对象结构中各个元素的访问操作。本文将详细探讨访问者模式在C++中的应用,并通过示例代码进行说明。 阅读详情

访问者模式

介绍:
  • 访问者模式,封着了一些作用于某些数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的操作
  • 主要将数据结构和数据操作分离,解决数据结构和操作耦合性问题
  • 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口
  • 访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同的操作(这些操作彼此没有关联),同时需要避免让这些操作“污染”这些对象的类,可以选用访问者模式解决
    在这里插入图片描述
说明:
  • visitor:是抽象访问者,为该对象结构中的concreteElement的每一个类声明一个visit操作
  • ConcreteVisitor:是一个具体的访问者,实现每个有visitor声明操作,是每个操作实现的部分
  • ObjectStructure:能枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素
  • Element:定义了一个accept方法,接收一个访问者对象
  • ConcreteElement:为具体元素,实现了accept方法
案例说明:

实现观众对歌手的评价
在这里插入图片描述

public abstract class Action {
    public abstract void getManResult(Man man);

    public abstract void getWoManResult(Women women);
}

public class Fail extends Action{
    @Override
    public void getManResult(Man man) {
        System.out.println("男人给的评价结果是失败");
    }

    @Override
    public void getWoManResult(Women women) {
        System.out.println("女人给的评价结果是失败");
    }
}

public class Success extends Action {
    @Override
    public void getManResult(Man man) {
        System.out.println("男人给的评价结果是成功");
    }

    @Override
    public void getWoManResult(Women women) {
        System.out.println("女人给的评价结果是成功");
    }
}

public abstract class Person {
    public abstract void accept(Action action);
}

/**
 * 1.这里使用到了双分派,即首先在客户端程序中,将具体状态作为参数传递给man中
 * 2.然后man类调用作为参数的具体方法中的getManResult,同时将自己(this)作为参数传入,作为第二次的分派
 */
public class Man extends Person {
    @Override
    public void accept(Action action) {
        action.getManResult(this);
    }
}

public class Women extends Person {
    @Override
    public void accept(Action action) {
        action.getWoManResult(this);
    }
}

public class ObjectStutrue {

    private List<Person> persons = new LinkedList<>();

    public void attach(Person person){
        persons.add(person);
    }

    public void detach(Person person){
        persons.remove(person);
    }

    public void display(Action action){
        for (Person p:persons) {
            p.accept(action);
        }
    }
}

public class Client {

    public static void main(String[] args) {
        final ObjectStutrue objectStutrue = new ObjectStutrue();
        objectStutrue.attach(new Man());
        objectStutrue.attach(new Women());

        final Success success = new Success();
        objectStutrue.display(success);
        System.out.println("----------------------------");
        final Fail fail = new Fail();
        objectStutrue.display(fail);
    }
}
双分派:

所谓双分派是指不管类怎么变化,我们都能找到期望的方法运行,双分派意味着得到执行的操作取决于请求的种类和两个接收者的类型

访问者模式注意事项和细节:
  • 优点
    1. ​ 访问者模式复合单一职责原则,让程序具有优秀的扩展性,灵活性非常高
    2. 访问者模式可以对功能进行统一,可以做报表,ui,拦截器与过滤器,适用于数据结构相对稳定的系统
  • 缺点
    1. 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则不建议的,这样造成了具体元素变更比较困难
    2. 违背了依赖倒转原则,访问者依赖的是具体元素,而不是抽象元素(getManresult(Man man))
    3. 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就比较合适
【Java设计模式】非循环访问者模式:简化对象交互 在Java开发中,设计模式是提高代码质量和可维护性的重要工具。本文将介绍非循环访问者模式(Acyclic Visitor Pattern),包括其意图、详细解释、编程示例、类图、适用场景、教程、优点和权衡以及相关设计模式。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。 阅读详情

相关推荐

​​WPF入门与XAML基础:从零开始构建你的第一个WPF应用​

本文是WPF入门系列首篇,详细介绍WPF的核心优势与开发环境搭建。通过创建第一个WPF项目,解析MainWindow.xaml和App.xaml等关键文件,深入讲解XAML基础语法,包括属性赋值、命名空间和事件绑定。最后通过按钮点击交互示例演示WPF应用程序运行流程,帮助开发者快速上手WPF开发,为后续学习布局系统和数据绑定等高级主题奠定基础。

Hare的博客 3276

设计模式(15) 访问者模式

**定义:**封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 **类型:**行为类模式 类图: ​ 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由。我们首先来看一个简单的例子,代码如下: class A { public void method1(){ System.out.printl...

cowbin2012的专栏 1万+

GCdepth散点图绘制

基因组组装完成后,需要对组装结果进行评估,其中GC_depth图是一个比较重要的指标,改图的横坐标是GC含量,纵坐标是平均深度。以30k为窗口(window)无overlap计算其GC含量和平均深度。如果存在样品污染,通常能够从GC含量分析中呈现出来。下文探索了几种绘制GC_depth散点图的方法思路。

huangliangbo的专栏 8993

设计模式(15)——访问者模式

目录访问者模式访问者模式应用实例访问者模式的注意事项和细节 测评系统的需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如 成功、失败 等) 传统方案 传统方案的问题分析 如果系统比较小,还是OK的,但是考虑系统增加越来越多的新的功能时,对代码改动较大,违反了ocp原则,不利于维护 扩展性不好,比如 增加了 新的人员类型,或者...

minge0001的博客 238

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

【机器学习】实验3,贝叶斯垃圾邮件识别(完整代码实现+报告)

电子邮件是互联网的一项重要服务,在大家的学习、工作和生活中会广泛使用。但是大家的邮箱常常被各种各样的垃圾邮件填充了。有统计显示,每天互联网上产生的垃圾邮件有几百亿近千亿的量级。因此,对电子邮件服务提供商来说,垃圾邮件过滤是一项重要功能。而朴素贝叶斯算法在垃圾邮件识别任务上一直表现非常好,至今仍然有很多系统在使用朴素贝叶斯算法作为基本的垃圾邮件识别算法。本次实验数据集来自的中文垃圾邮件数据集,目录解压后包含三个文件夹,其中data目录下是所有的邮件(未分词),已分词好的邮件在data_cut目录下。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 5025

Java设计模式[15]-访问者模式

访问者模式基本介绍 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题。 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。 访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决。 访问者模式的原理类图

JensenPWLee的博客 212

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 419

二、15【设计模式】之访问者模式

今天的博客主题 设计模式——》设计模式之访问者模式 访问者模式 VP (Visitor Pattern) 定义 一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,可在不改变数据结构的前提下定义作用于这些元素的新的操作。 访问者模式被称为最复杂的设计模式,使用频率还不高。 作者也说了,大多数情况下,你不需要使用访问者模式,但一旦需要使用时,那就真的需要了。 应用场景 1) 优点 1) 缺点 1) 源...

刘总Java 140

VS Code + EIDE + Clangd 构建 Keil/MDK 嵌入式开发新范式

嵌入式C/C++开发长期受限于传统IDE的语法理解弱、导航卡顿、跨工程复用难等问题。Clangd作为基于AST的现代语言服务器,结合EIDE对Keil uVision和ARM MDK工程文件(.uvprojx)的深度解析能力,可将编译配置、芯片型号、内存模型、扩展关键字等语义精准翻译为标准compile_commands.json,从而实现智能跳转、宏展开识别、结构体实时展开等高阶编辑体验。该方案不替换Keil/MDK编译与烧录流程,仅升级代码理解层,天然兼容STC8051、STM32 Cortex-M、G

weixin_34321753的博客 352

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 786

设计模式——(15)访问者模式

1、定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 可以对定义这么理解:有这么一个操作,它是作用于一些元素之上的,而这些元素属于某一个对象结构。同时这个操作是在不改变各元素类的前提下,在这个前提下定义新操作是访问者模式精髓中的精髓。 2、UML类图 Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类

DF10f-0001A 171

手把手教你玩转CPU微架构专栏--​​​​1.5 工具准备:用Gem5模拟器“看见”微架构(安装、基础仿真命令)​

本文介绍了如何使用Gem5模拟器进行微架构学习和实验。Gem5是一款支持多种指令集的开源微架构模拟器,可模拟CPU流水线、缓存等核心组件。文章详细说明了在Ubuntu和macOS上安装Gem5的步骤,包括依赖安装、源码编译和验证方法。通过一个简单的加法指令测试程序,演示了如何运行基础仿真并解读输出日志,包括指令执行流程和性能统计数据。此外,还提供了两个实战实验:修改L1缓存大小和观察分支预测失败,帮助读者理解微架构参数对性能的影响。最后指出Gem5是学习微架构的"显微镜",能直观观察指令

xiaoheshang_123的博客 140

Android设计模式-15-访问者模式

1. 定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作 将数据操作与数据结构分离 2. 使用场景 对象结构比较稳定,但经常需要在此对象结构上定义新的操作 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作污染这些对象的类,也不希望在增加新操作时修改这些类 3. 优缺点 优点: 符合单一职责原则 优秀的扩展性 灵活性 缺点: 具体元素对访问者公布细节,违反了迪米特原则 具体元素变更比较困难 违反了依赖倒

o118abcdef的博客 172

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式学习(17) 23-15 访问者模式

(《设计模式:可复用面向对象软件的基础》)

qq_37763312的博客 686

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式~访问者模式(Visitor)-15

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。

Jeremy321321的博客 665

visio安装包

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

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

访问者模式。

诗人不写诗 134

深入理解设计模式(15):访问者模式

一、什么是访问者模式 定义:表示一个作用于其对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 可以对定义这么理解:有这么一个操作,它是作用于一些元素之上的,而这些元素属于某一个对象结构。同时这个操作是在不改变各元素类的前提下,在这个前提下定义新操作是访问者模式精髓中的精髓。 主要解决:稳定的数据结构和易变的操作耦合问题。就是把数据结构和作用于...

dbc68367的博客 456

JAVA应用访问者模式注意点_15.java设计模式之访问者模式

在访问者模式(Visitor)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作也就是说,被访问者可以根据不同的访问者做出不同的响应封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作...

weixin_29095587的博客 135

JAVA设计模式-15-访问者模式

参考:http://blog.youkuaiyun.com/pengjunlee/article/details/54429325一、什么是访问者模式访问者(Visitor)模式是一种对象的行为模式。在访问者模式里,每个访问者表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 在面向对象的系统开发和设计过程中,经常遇到的一种情况就是需求变更,针对已经开发

KeepLearning的博客 210

15、C语言和设计模式(访问者模式)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的

我有我的天空 526

Android设计模式之(15)----访问者模式

访问者模式访问者模式属于行为模式。访问者模式中属于相对比较复杂的一类,它会在A中让B访问,而实际在B中实际调用的是A的方法.class A { public void method1(){ System.out.println("AAAAAA"); } public void method2(B b){ b.showA(this); }

asddavid的专栏 372

23种设计模式 VOL.15: 访问者模式

思想: 数据结构元素具有稳定性质, 访问对象是变化的, 访问对象对数据结构元素进行访问; 说明: 对各阶段人群的生活方式解耦 -> 数据结构元素(幼年, 青年, 中年, 老年)与访问对象(生活方式)解耦; 角色说明 Visitor: 抽象访问者(可以有不同的具体访问者), 用于访问数据结构元素; ConcreteVisitor: 具体访问者, 具体的访问者访问数据结构元素;...

aa503709643的博客 192

一篇文章带你搞懂“设计模式”! - - 访问者模式(15)

访问者模式是一种行为设计模式,它通过将数据结构与数据操作分离,在不改变数据结构的前提下定义新的操作。该模式包含访问者接口、具体访问者、元素接口、具体元素和对象结构等主要角色,适用于需要对稳定数据结构进行多种不同操作的场景。其优点包括符合单一职责原则、扩展性强、灵活性高,能统一处理报表、UI等功能;缺点是违背了依赖倒转原则,且具体元素变更困难。该模式适合数据结构稳定但功能需求频繁变化的系统。

chools、一个破敲代码的,感谢收看。 171

JAVA设计模式学习

目录: 一、工厂方法模式   二、抽象工厂模式  三、建造者模式  四、桥接模式  五、组合模式   六、适配器模式    七、装饰者模式 一、工厂方法模式 工厂方法模式设计方案:将项目的实例化功能抽象成抽象方法,在不同的子类中具体实现。 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。 public abstract cla...

JiaVaHao的博客 1173

设计模式之访问者模式

访问者模式(Visitor Pattern)是 GoF 提出的 23 种设计模式中的一种,属于行为模式。访问者者模式的英文翻译是 Visitor Design Pattern。翻译成中文就是:允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性。

SmartSi 1697
上一篇: 设计模式-14命令模式
下一篇: 设计模式-16迭代器模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值