20:访问者模式

news2025/7/7 16:48:59

1:定义

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

2:结构

访问者模式包含以下主要角色:

  • 抽象访问者(Visitor)角色:定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。

  • 具体访问者(ConcreteVisitor)角色:给出对每一个元素类访问时所产生的具体行为。

  • 抽象元素(Element)角色:定义了一个接受访问者的方法(accept),其意义是指,每一个元素都要可以被访问者访问。

  • 具体元素(ConcreteElement)角色: 提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。

  • 对象结构(Object Structure)角色:定义当中所提到的对象结构,对象结构是一个抽象表述,具体点可以理解为一个具有容器性质或者复合对象特性的类,它会含有一组元素(Element),并且可以迭代这些元素,供访问者访问。

3:案例实现

【例】给宠物喂食

现在养宠物的人特别多,我们就以这个为例,当然宠物还分为狗,猫等,要给宠物喂食的话,主人可以喂,其他人也可以喂食。

  • 访问者角色:给宠物喂食的人

  • 具体访问者角色:主人、其他人

  • 抽象元素角色:动物抽象类

  • 具体元素角色:宠物狗、宠物猫

  • 结构对象角色:主人家

代码如下:  

创建抽象访问者接口

public interface Person {
    void feed(Cat cat);

    void feed(Dog dog);
}

创建不同的具体访问者角色(主人和其他人),都需要实现 Person接口

public class Owner implements Person {

    @Override
    public void feed(Cat cat) {
        System.out.println("主人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        System.out.println("主人喂食狗");
    }
}

public class Someone implements Person {
    @Override
    public void feed(Cat cat) {
        System.out.println("其他人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        System.out.println("其他人喂食狗");
    }
}

定义抽象节点 -- 宠物

public interface Animal {
    void accept(Person person);
}

定义实现Animal接口的 具体节点(元素)

public class Dog implements Animal {

    @Override
    public void accept(Person person) {
        person.feed(this);
        System.out.println("好好吃,汪汪汪!!!");
    }
}

public class Cat implements Animal {

    @Override
    public void accept(Person person) {
        person.feed(this);
        System.out.println("好好吃,喵喵喵!!!");
    }
}

定义对象结构,此案例中就是主人的家

public class Home {
    private List<Animal> nodeList = new ArrayList<Animal>();

    public void action(Person person) {
        for (Animal node : nodeList) {
            node.accept(person);
        }
    }

    //添加操作
    public void add(Animal animal) {
        nodeList.add(animal);
    }
}

测试类

public class Client {
    public static void main(String[] args) {
        Home home = new Home();
        home.add(new Dog());
        home.add(new Cat());

        Owner owner = new Owner();
        home.action(owner);

        Someone someone = new Someone();
        home.action(someone);
    }
}

5:优缺点

1,优点:

  • 扩展性好

    在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。

  • 复用性好

    通过访问者来定义整个对象结构通用的功能,从而提高复用程度。

  • 分离无关行为

    通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

2,缺点:

  • 对象结构变化很困难

    在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。

  • 违反了依赖倒置原则

    访问者模式依赖了具体类,而没有依赖抽象类。

5:使用场景

  • 对象结构相对稳定,但其操作算法经常变化的程序。

  • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab 高光谱遥感数据处理与混合像元分解

教程从基础、方法、实践三方面对高光谱遥感进行讲解。基础篇&#xff0c;站在学员的角度去理解“高光谱”&#xff0c;用大家能听的懂的语言去讲述高光谱的基本概念和理论&#xff0c;帮助学员深入理解这项技术的底层科学机理。方法篇&#xff0c;将高光谱技术与MATLAB工具结合…

Yolov5:强大到你难以想象──新冠疫情下的口罩检测

初识Yolov5是看到一个视频可以检测街道上所有的行人&#xff0c;并实时框选出来。之后学习了CNN卷积神经网络&#xff0c;在完成一个项目需求时&#xff0c;发现卷积神经网络在切割图像方面仍然不太好用。于是我想到了之前看到的Yolov5&#xff0c;实战后不禁感慨一句&#xff…

50天50个前端小项目(纯html+css+js)第十八天(背景轮播图)

今天要做的是一个轮播图&#xff0c;不过是属于全屏类型的轮播图&#xff0c;先来看看效果&#xff1a; 点击左右按钮能切换背景&#xff0c;达到轮播图效果 来看代码实现部分&#xff0c;首先是html: <!DOCTYPE html> <html lang"en"><head>&…

四大含金量高的算法证书考试

证书考试推荐一、PAT 计算机程序设计能力测试二、CCF CSP认证三、团体程序设计天梯赛四、蓝桥杯大赛一、PAT 计算机程序设计能力测试 官网&#xff1a;PAT 计算机程序设计能力测试 PAT为浙江大学出的一款程序设计的测试网站&#xff0c;分为乙级、甲级、顶级三种&#xff0c;…

【MySQL 第十二天 事务的介绍|InnoDB使用事务】

【MySQL 第十二天 事务的介绍|InnoDB使用事务】【1】mysql事物的介绍【2】mysql事务处理的方法【3】mysql是u用InnoDB使用事务生命不息&#xff0c;学习不止 【1】mysql事物的介绍 atomicity 原子性&#xff1a;所有事情是统一的整体&#xff0c;必须一起执行&#xff0c;或者都…

2022 需求工程综合论述题【太原理工大学】

需求工程考题的最后一个模块 —— 综合论述题&#xff0c;只出一道题&#xff0c;30分&#xff0c;马上要考试了&#xff0c;临时抱佛脚其实还是非常管用的 hhh&#xff0c;简答、选择、填空及材料分析题前面博客已更&#xff0c;重点把下面这两个题看明白&#xff0c;仅供参考…

Real-Time Rendering——18.4 Optimization优化

Once a bottleneck has been located, we want to optimize that stage to boost the performance. In this section we present optimization techniques for the application,geometry, rasterization, and pixel processing stages. 一旦找到瓶颈&#xff0c;我们希望优化该…

Nginx 安全漏洞【CVE-2018-16843、CVE-2018-16844】解决办法

CVE-2018-16843和CVE-2018-16844漏洞影响 1.9.5 和 1.15.5 之间的所有 nginx 版本 解决办法&#xff1a;关闭http/2请求处理和MP4流媒体支持&#xff0c;将Nginx 升级至1.22.1 stable 最新版本。 操作步骤&#xff1a; 1、查看当前版本信息及配置参数&#xff1a; sudo /us…

深度学习入门(十三)前向传播、反向传播和计算图

深度学习入门&#xff08;十三&#xff09;前向传播、反向传播和计算图前言前向传播、反向传播和计算图教材前向传播前向传播计算图反向传播训练神经网络小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用&#xff0c;防止遗忘 前向传播、反向传播和计…

Android akptool 安装 mac 电脑

在之前&#xff0c;apktool工具包都是一个压缩包&#xff0c;下载后无需安装即可使用。下面我们看一下如何在Mac OS系统下如何安装 apktool工具包。 首先&#xff0c;需要下载下面几个软件或工具&#xff1a; Apktool&#xff1a;http://ibotpeaches.github.io/Apktool/instal…

【Spark NLP】第 18 章:人类标签

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

猿创征文c++学习之路的工具

目录猿创征文|c学习之路的工具工具1.Visual Studio工具2.印象笔记工具3.Git小乌龟工具4.pycharm工具5.msdn工具6.xshell工具7.xmind猿创征文|c学习之路的工具 工具1.Visual Studio 优点&#xff1a; 1.代码提示 2.非常棒的用户体验界面 3.支持c/c等等语言的库 4.优秀的数据库…

CSS的简单了解

目录 1、什么是CSS&#xff1f; 2、引入方式 &#xff08;1、内部样式 &#xff08;2、内联样式 &#xff08;3、外部样式 3、选择器 4、CSS常用元素属性 &#xff08;1、文本属性 &#xff08;2、文本格式 &#xff08;3、背景属性 &#xff08;4、生成圆角矩形与圆…

【阅读笔记】多任务学习之MMoE(含代码实现)

本文作为自己阅读论文后的总结和思考&#xff0c;不涉及论文翻译和模型解读&#xff0c;适合大家阅读完论文后交流想法。 MMoE一. 全文总结二. 研究方法三. 结论四. 创新点五. 思考六. 参考文献七. Pytorch实现⭐一. 全文总结 提出了一种基于**多门混合专家(MMoE)**结构的多任…

MySQL数据库基础操作

目录 前言&#xff1a; 库的操作 创建数据库 显示所有数据库 选中数据库 删除数据库 MySQL数据类型 数值类型 字符串类型 日期类型 表的操作 创建表 显示数据库中所有表 查看表结构 删除表 小结&#xff1a; 前言&#xff1a; &#x1f389;MySQL是关系型数据…

【jquery Ajax】接口的学习与Postcode插件的使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 目录 接口 接口的概念 分析接口的请求过程 通过GET方式请求接口的过程 通过post方式请求接口的过程 接口…

基于CarSystemUI实现左侧导航栏NavigationBar及下拉面板定制开发——Android10智能座舱

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

使用多阶段和多尺度联合通道协调注意融合网络进行单图去雨[2022论文]

这是篇2022年来自一区的International Journal of Intelligent Systems的贵州大学的去雨论文 论文链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;zdje ✍介绍 作者提出的问题&#xff1a; 1、目前去雨方法不能对不同密度和方向的雨条纹信息进行有效的编码 2、…

ThreadLocal类详解

ThreadLocal类注释翻译 打开JDK中ThreadLocal类源码&#xff0c;翻译类上注释如下(提取重点部分): 每个访问ThreadLocal实例对象的线程都有其自己的关于ThreadLocal对象的变量副本(通过get和set方法)&#xff0c;只要线程存活而且ThreadLocal对象也存活&#xff0c;则线程都保…

嵌入式和单片机开发模式的区别

一、 开发模式 单片机开发多为裸机&#xff0c;程序规模小&#xff0c;多为单个程序员独立开发。有些复杂产品也会使用高端单片机如STM32之类&#xff0c;并使用RTOS(uCOS、freeRTOS等)。嵌入式开发几乎全部基于嵌入式操作系统&#xff0c;目前使用最多的是 linux 和Android。…