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

news2025/1/11 22:43:54

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的访问者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

文章目录

  • 访问者模式概念
  • 访问者模式主要角色
  • 访问者优缺点
  • 访问者案例

以下正文开始
在这里插入图片描述

访问者模式概念

访问者模式是一种行为型设计模式,它将算法与其所作用的对象分离开来,使得能够在不改变对象结构的前提下,对对象中的元素进行新的操作。该模式的核心思想是,定义一个访问者对象,并将其传递给需要被访问的对象,在对象接受访问者的访问时,会调用访问者对象中的方法,在该方法中实现对象对于访问者的响应操作。

访问者模式主要角色

访问者模式中的主要角色包括:

抽象访问者(Visitor):定义了访问者可以访问的元素、如何访问元素的方法,不同的具体访问者可以实现不同的访问方式。

具体访问者(ConcreteVisitor):实现抽象访问者中定义的方法,对元素进行具体的操作。

抽象元素(Element):定义了接受访问者访问的方法,不同的具体元素可以实现该方法以不同的方式响应访问者的访问。

具体元素(ConcreteElement):实现抽象元素中定义的接受访问者访问的方法,并在其中调用访问者的访问方法。

对象结构(Object Structure):定义了具体元素的集合,并提供了遍历集合中元素的方法。

访问者优缺点

访问者模式的优点包括:

将算法与对象结构分离,可以灵活地添加新的访问者和元素类型。

符合单一职责原则,使得代码更加清晰、易于维护。

访问者模式的缺点包括:

增加新的元素类型会导致访问者的实现类数量增加,系统的复杂度会增加。

具体元素暴露了访问者所需的所有细节,增加了对象间的依赖关系。

访问者案例

假设有一个图形绘制程序,它支持图形对象的添加、删除以及移动等操作。其中包含三种图形对象:圆形、矩形和三角形。

首先需要定义抽象元素接口 Shape,它包含了接受访问者 visit() 方法的定义:

public interface Shape {
    void accept(Visitor visitor);
}

每一个具体的图形对象都需要实现该接口,并在其中调用访问者对象中相应的操作方法。例如,圆形类实现如下:

public class Circle implements Shape {
    private int x;
    private int y;
    private int radius;

    public Circle(int x, int y, int radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    public void accept(Visitor visitor) {
        visitor.visitCircle(this);
    }

    // ...
}

其中的 accept() 方法中的参数 visitor 是访问者对象,它的 visitCircle() 方法是针对圆形对象的处理方法。

接下来需要定义抽象访问者接口 Visitor,它包含了不同类型的具体元素的访问方法定义:

public interface Visitor {
    void visitCircle(Circle circle);
    void visitRectangle(Rectangle rectangle);
    void visitTriangle(Triangle triangle);
}

定义了抽象元素和抽象访问者后,就可以定义具体的访问者类了。例如,一个画图访问者类,实现了抽象访问者接口中不同元素的操作方法:

public class DrawingVisitor implements Visitor {
    public void visitCircle(Circle circle) {
        // 画圆形
        System.out.println(String.format("Draw Circle, x=%d, y=%d, r=%d", 
                                          circle.getX(), circle.getY(), circle.getRadius()));
    }

    public void visitRectangle(Rectangle rectangle) {
        // 画矩形
        System.out.println(String.format("Draw Rectangle, x=%d, y=%d, w=%d, h=%d", 
                                          rectangle.getX(), rectangle.getY(), rectangle.getWidth(), rectangle.getHeight()));
    }

    public void visitTriangle(Triangle triangle) {
        // 画三角形
        System.out.println(String.format("Draw Triangle, x1=%d, y1=%d, x2=%d, y2=%d, x3=%d, y3=%d", 
                                          triangle.getX1(), triangle.getY1(),
                                          triangle.getX2(), triangle.getY2(),
                                          triangle.getX3(), triangle.getY3()));
    }
}

最后,定义客户端类对图形对象进行访问:

public class Client {
    public static void main(String[] args) {
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle(10, 20, 5));
        shapes.add(new Rectangle(30, 40, 50, 60));
        shapes.add(new Triangle(70, 80, 90, 100, 110, 120));

        Visitor visitor = new DrawingVisitor();
        for (Shape shape : shapes) {
            shape.accept(visitor);
        }
    }
}

其中,先创建了一个包含多种图形对象的列表 shapes,再创建一个画图访问者对象 drawingVisitor,最后遍历 shapes 列表中的所有图形对象,并使用 accept() 方法接受 drawingVisitor 的访问进行相应操作。

以上就是访问者模式在Java语言中的具体实现。通过参考这个例子,您可以更好地理解访问者模式的工作原理及其优缺点,同时也可根据需要对其进行进一步了解与应用。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

chatgpt没有免费版的吗?如何使用ChatGPT?

ChatGPT是基于GPT模型的聊天机器人&#xff0c;目前没有免费版。ChatGPT是由OpenAI开发的&#xff0c;OpenAI的GPT模型需要大量的计算资源和技术支持&#xff0c;因此需要付费才能使用。 目前&#xff0c;OpenAI提供了两种方式来使用GPT模型&#xff1a; 1. OpenAI API OpenA…

制造型企业降本增效的最佳工具,质量管理系统,该如何利用好

许多制造业企业质量管理主要用于解决制造业质检效率低下、作业不规范等难题&#xff0c;形成质量检验、质量方案、档案数据、统计分析一体化的质量管理体系&#xff0c;有效为企业质量管理提速降本增效&#xff0c;实现企业数字化转型。在没有正确利用质量管理系统之前&#xf…

45个 Cha​tGPT 常用插件说明

45个 ChatGPT 常用插件说明 ChatGPT常用的45个插件&#xff0c;以及它们用途说明&#xff1a; 1/ Slack&#xff1a;查询Slack信息 2/ Zapier&#xff1a;与5000应用&#xff0c;如Google Sheets和Docs进行交互。 3/ Expedia&#xff1a;在一个地方激活你的旅行计划 4/ Kla…

Worldclim(v1.4、v2.1)数据集使用介绍

最近在使用Worldclim的数据&#xff0c;在这里记录一下该数据集的使用。 如果你想得到过去、现在和未来的气候数据&#xff0c;那么你可以使用这个数据集&#xff1a;Worldclim数据集 该数据集包含了4种时期的气候数据&#xff1a;历史时期的末次盛冰期、全新世中期、当前时…

操作系统(3.3)--线程的实现方式

进程调度的任务、机制和方式 1.进程的调度任务 进程调度的任务主要有三&#xff1a; (1)保存处理机的现场信息。在进程调度进行调度时&#xff0c;首先需要保存当前进程的处理机的现场信息&#xff0c;如程序计数器、多个通用寄存器中的内容等 (2)按某种算法选取进程。调度…

脉冲神经网络深度残差学习(ResNet)

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;Deep Residual Learning in Spiking Neural Networks 论文链接: https://arxiv.org/pdf/2102.04159v3.pdf 代码链接&#xff1a;https: //github.com/fangwei123456/Spike-Element-Wi…

MYSQL数据库基础(数据库)

文章目录 一、数据库使用流程二、数据库的操作三、常用数据类型3.1 数值类型3.2 字符串类型3.3 日期类型 四、数据表操作 一、数据库使用流程 用户在客户端输入SQL语句客户端会把SQL通过网络发送给服务器服务器会执行这个SQL&#xff0c;把结果返回给客户端客户端接收到结果后…

第十九篇、基于Arduino uno,获取光电开关(NPN/PNP型)的信号——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;如果有遮挡会输出低电平或者高电平&#xff0c;没有遮挡会输出高电平或者低电平&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;这里要区分到底是NPN型号的&#xff0…

分享几个索引创建的小 Tips

文章目录 1. 冗余索引1.1 联合索引左边列1.2 索引中加入主键 2. 隐藏的索引排序3. 删除不使用的索引4. 手动更新索引统计信息5. 适时优化表 关于 MySQL 中的索引&#xff0c;松哥前面已经和小伙伴们聊了不少了&#xff0c;不过在索引使用的时候&#xff0c;还是有一些需要注意的…

如何发布一个npm包

1、注册账号 https://www.npmjs.com/ 使用邮箱注册即可 a. 邮箱会在本地登录时发送验证码使用 b. 发布包后邮箱会收到通知 2、生成AccessToken &#xff08;1&#xff09;直接本地登录 # 根据提示输入用户名、密码、注册邮箱 npm login# 输入完邮箱会发送验证码&#xff0c…

如何做一个有质量的技术分享

分享信息并不难,大多数人都能做到,就算是不善言谈性格内向的技术人员,通过博客或社交媒体,或是不正式的交流,他们都能或多或少的做到。但是如果你想要做一个有质量有高度的分享,这个就难了。 所谓的有质量和有高度,我心里面的定义有两点: 分享内容的保鲜期是很长的会被…

win11本地安装k8s

1、确保本地已经安装DesktopDocker&#xff1b; 2、使用choco下载安装Kind&#xff0c;正常下载安装报错提示&#xff0c;建议使用管理员权限 使用管理员权限下载安装Kind 也可以从github下载kind到本地进行安装&#xff0c;下载地址 Releases kubernetes-sigs/kind GitHub …

分布式锁Redis基础理论与落地实现与Redisson。

分布式锁Redis基础理论与落地实现 基本概念基于Redis的分布式锁基本用法基于Redis实现分布式锁初级版本改进Redis的分布式锁问题Redis的Lua脚本利用Lua脚本写释放锁业务流程再次改进Redis的分布式锁 总结 Redisson基于setnx实现的分布式锁存在下面的问题Redisson入门Redisson可…

64位系统究竟牛逼在哪里?

想必大家都遇到过这样的问题&#xff1a;安装某个软件的时候&#xff0c;出现提示选择32位版本还是64位版本&#xff1f;我们也可以查看自己的电脑是32位还是64位系统。 Windows Linux 大家可能知道32位和64位和系统有关&#xff0c; 但其实 32 vs 64 可以有多重含义。 一般情…

JVM学习笔记(上)

1、总体路线 2、程序计数器 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记录下一条 jvm 指令的执行地址行号。 特点&#xff1a; 是线程私有的不会存在内存溢出 解释器会解释指令为机器码交给 cpu 执行&#xff0c;程序计数器会…

GCC写个库给你玩,就这?

前言 什么是GCC GCC原名为 GNU C语言编译器 「GCC」(GNU Compiler Collection,GNU编译套件) 是由GNU开发的编程语言编译器。 正文 安装命令 sudo apt-get insatll gcc g注意安装版本要大于4.8.5因为4.8.5以后的版本才支持c11标准 查看版本 gcc -v gcc --version g -v g …

Vue.js 的数据双向绑定实现原理

Vue.js 的数据双向绑定实现原理 Vue.js 是一款流行的前端框架&#xff0c;它采用了数据双向绑定的方式&#xff0c;让前端开发人员更加方便地管理数据和视图。在本文中&#xff0c;我们将深入探讨 Vue.js 的数据双向绑定实现原理&#xff0c;以及相关的代码示例。 数据双向绑定…

1. TensorRT量化的定义及意义

前言 手写AI推出的全新TensorRT模型量化课程&#xff0c;链接&#xff1a;TensorRT下的模型量化。 课程大纲如下&#xff1a; 1. 量化的定义及意义 1.1 什么是量化&#xff1f; 定义 量化(Quantization)是指将高精度浮点数(如float32)表示为低精度整数(如int8)的过程&…

jmeter性能测试步骤实战教程

1. Jmeter是什么&#xff1f; 2. Jmeter安装 2.1 JDK安装 由于Jmeter是基于java开发&#xff0c;首先需要下载安装JDK &#xff08;目前JMeter只支持到Java 8&#xff0c;尚不支持 Java 9&#xff09; 1. 官网下载地址&#xff1a; http://www.oracle.com/technetwork/java/…

Map、Set和哈希表的应用练习(数据结构系列15)

目录 前言&#xff1a; 练习题&#xff1a; 结束语&#xff1a; 前言&#xff1a; 在上一节博客中小编给大家介绍了Map、Set和哈希表的一些简单的知识点&#xff0c;同时也给大家简单的演示了一下如何使用他们里面的一些基础方法&#xff0c;那么接下来让小编带着你们一起来…