【设计模式】访问者模式

news2024/12/22 19:37:26

文章目录

  • 1.访问者模式定义
  • 2.访问者模式的角色
  • 3.访问者模式实战案例
    • 3.1.场景说明
    • 3.2.UML类图
    • 3.3.代码实现
  • 4.访问者模式优缺点
  • 5.访问者模式适用场景
  • 6.访问者模式总结

在这里插入图片描述

主页传送门:💁 传送

1.访问者模式定义

       访问者模式(Visitor Pattern),是一种相对简单的设计模式。其定义如下:

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

       即:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
       其通用类图如下:
在这里插入图片描述

2.访问者模式的角色

访问者模式涉及到的角色如下:

  • 抽象访问者(Visitor)角色:
    声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。
  • 具体访问者(ConcreteVisitor)角色:
    实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。
  • 抽象节点(Node)角色:
    声明一个接受操作,接受一个访问者对象作为一个参数。
  • 具体节点(ConcreteNode)角色:
    实现了抽象节点所规定的接受操作。
  • 结构对象(ObjectStructure)角色:
    有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。

3.访问者模式实战案例

3.1.场景说明

       使用访问者模式完成对计算机各个硬件的访问。

3.2.UML类图

       使用访问者模式来实现的结构图如下:
在这里插入图片描述

3.3.代码实现

创建硬件抽象类

public abstract class Hardware {
    String type ;//型号
    //构造器
    public Hardware(String type )
    {
        this.type = type;
    }

    public String getType()
    {return this.type;}

    //运转
    public abstract void run();

    //接受计算机的访问者
    public abstract void accept(ComputerVisitor computerVisitor);

}

创建具体硬件
CPU

public class CPU extends Hardware {
    public CPU(String type) {
        super(type);
    }

    @Override
    public void run() {
        System.out.println("型号为"+type+"的CPU正在运行...");
    }

    @Override
    public void accept(ComputerVisitor computerVisitor) {
        computerVisitor.visitCPU(this);
    }
}

硬盘

public class HardDisk extends Hardware {
    public HardDisk(String type) {
        super(type);
    }

    @Override
    public void run() {
        System.out.println("型号为"+type+"的硬盘正在运行...");
    }

    @Override
    public void accept(ComputerVisitor computerVisitor) {
        computerVisitor.visitHardDisk(this);
    }
}

创建电脑访问者抽象类

public interface ComputerVisitor {
    void visitCPU(CPU cpu);//访问CPU
    void visitHardDisk(HardDisk hardDisk);//访问硬盘
}

创建电脑访问者的具体实现类

public class RunVisitor implements ComputerVisitor {
    @Override
    public void visitCPU(CPU cpu) {
        cpu.run();
    }

    @Override
    public void visitHardDisk(HardDisk hardDisk) {
        hardDisk.run();
    }
}
public class TypeVisitor implements ComputerVisitor {
    @Override
    public void visitCPU(CPU cpu) {
        System.out.println("CPU型号:"+cpu.getType());
    }

    @Override
    public void visitHardDisk(HardDisk hardDisk) {
        System.out.println("硬盘型号:"+hardDisk.getType());
    }
}

创建电脑类

public class Computer {
    private Hardware cpu;
    private Hardware hardDisk;

    public Computer()
    {
        this.cpu = new CPU("Tntel Core i7-620");
        this.hardDisk = new HardDisk("Seagate 500G 7200转");
    }

    public void accept(ComputerVisitor computerVisitor)
    {
        cpu.accept(computerVisitor);
        hardDisk.accept(computerVisitor);
    }
}

创建测试类

public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer();
        //类型访问者
        ComputerVisitor typeVisitor = new TypeVisitor();
        //运行的硬件访问者
        ComputerVisitor runVisitor = new RunVisitor();

        computer.accept(typeVisitor);
        System.out.println("-------------------------");
        computer.accept(runVisitor);
    }
}

测试结果:
在这里插入图片描述

4.访问者模式优缺点

访问者模式的优点主要包括:

  • 增加了新的操作很容易,只需要增加一个新的访问者即可。
  • 将相关的行为封装到一个访问者中,可以实现更好的代码组织和管理。
  • 访问者模式符合单一职责原则,每个类只负责一个职责。

访问者模式的缺点主要包括:

  • 具体元素对访问者公布细节,违反了迪米特原则。
  • 具体元素变更比较困难,因为访问者模式依赖于具体类的细节。
  • 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

5.访问者模式适用场景

访问者模式适用于以下场景:

  1. 数据结构相对稳定,而操作易于变化的情况。
  2. 需要对一个对象结构进行很多不同的操作,而不是仅仅对整个对象结构做一些简单操作。
  3. 需要对对象结构中的各个元素进行很多不同的操作,而不是仅仅对对象结构中某个特定元素做一些简单操作。

6.访问者模式总结

     访问者模式是一种行为型设计模式,它将数据结构与数据操作分离,使得在不改变数据结构的前提下可以定义作用于这些元素的新的操作。该模式主要针对系统中拥有固定类型数的对象结构,在其内提供一个accept()方法来接受访问者对象的访问。不同的访问者对同一个元素的访问内容是不同的,使得相同的元素集合可以产生不同的数据结果。
     总的来说,访问者模式适用于数据结构相对稳定,而操作易于变化的情况。在使用时,需要根据实际需求权衡利弊,注意避免违反设计原则的问题。同时,访问者模式也需要根据具体的应用场景来进行选择和设计,以满足系统的需求和变化。

如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞

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

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

相关文章

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境: MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC),在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

黑马JVM总结(二十六)

(1)异常-catch 下面看一下字节码里面怎么做异常的处理 (2)异常-多个catch astore_2:就是把异常对象的地址存到局部变量表2号曹位上 (3)异常-multicatch (4)异常-finally &#xff0…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果,话不多说,先来看看视频效果吧:链接 在这里具体的代码就不放出来了,还是利用了uniapp的 uni.createAnimation 方法,因为cover-view 不支持一些css 的动画效果,所以这…

探秘布隆过滤器:高效数据查找与去重利器

探秘布隆过滤器:高效数据查找与去重利器 引言 在现代计算机科学中,数据的查找与去重是一个至关重要的问题。本文将介绍一种高效的数据结构——布隆过滤器,它能够在海量数据中快速判断某个元素是否存在,同时具有出色的空间效率。…

动态调整系统主题色(4): CssVar 与 Variant 方案的探索

动态调整系统主题色(4): CssVar 与 Variant 方案的探索 动态调整系统主题色(4): CssVar 与 Variant 方案的探索 前言方案的介绍与比较 CssVar (CSS 变量方案)CSS 变量方案与 tailwindcss 的结合Variant 方案 2种方案在小程序上的示例之前的几篇 前言 这篇已经是动态调整系统…

深度学习模型部署与优化:策略与实践;L40S与A100、H100的对比分析

★深度学习、机器学习、生成式AI、深度神经网络、抽象学习、Seq2Seq、VAE、GAN、GPT、BERT、预训练语言模型、Transformer、ChatGPT、GenAI、多模态大模型、视觉大模型、TensorFlow、PyTorch、Batchnorm、Scale、Crop算子、L40S、A100、H100、A800、H800 随着生成式AI应用的迅猛…

python打开浏览器并模拟搜索

打开已存在的浏览器 打开已存在的浏览器有个很重要的作用就是,可以对于一些登录场景,提前登录好,不需要模拟登录了。 在命令行中执行打开chrome的命令,在图标上找到chrome的安装位置 在cmd命令行下执行命令 C:\Program Files\…

工厂管理软件中的计划排产是什么

一、计划排产的定义: 计划排产是指根据工厂的生产能力、订单需求和资源限制等因素,合理安排生产任务和时间,以实现高效的生产计划。它涉及到生产订单的分配、生产线的调度和资源的优化利用,旨在提高生产效率、缩短交货时间和降低…

高速公路堵车动力学

S/t trace 图可以分析牛顿力学时间序列的一切。 下例分析了当车距太小时,一个轻微的刹车扰动如何触发大堵车的: 堵车由以下因素促成: 刹车反应时间,刹车反应很快,看见灯即可,即使这样越往后刹车必须越狠&…

对于对象初始化的加深理解

一道有一定难度和挑战性的注重细节的有趣的面试题 目录 案例需求不同写法与角度下写法一写法二写法三写法四A类B类测试类 注参考视频 案例需求 不同写法与角度下 写法一 注:方法的修饰符为private package com.xie.interview;/*** 对象属性初始化相关的面试笔试题*…

Stable diffusion的架构解读(本博客还是以unet架构为主)

博客只是简单的记录一下自己学的,基于自己的一些情况,所以简单了一些只是将来忘记,用来回顾用。 论文的大体框架 unet结构位于 unet会接受prompt特征、latent特征、和t时间步特征,最后生成新一轮的特征 可以参考知乎大佬htt…

re学习(37)DASCTF 2023 0X401七月暑期挑战赛 controflow

程序通过改变栈里面的返回地址来控制程序的控制流 从而达到混淆的效果 左侧有许多被hook的函数 在每个函数开头设置断点 然后观察程序的运行流程 会发现输入的数据会进行 异或 相加 异或 相减 相乘 异或等操作 要注意部分运算的索引是 从[10]开始的 具体思路参考&#xf…

三十、【进阶】B-Trees的演变过程

1、索引结构 (1)二叉树 (2)B-Tree树 B-Tree树最大度数为5,代表每一个节点最多存储4个key(每个节点最多存储4个数据),5个指针(可以指向5个子节点)。 2、演变过程(最大度数为5) &…

gorm 自定义时间、字符串数组类型

文章目录 自定义时间类型自定义字符串数组测试与完整代码测试代码测试结果 GORM 是GO语言中一款强大友好的ORM框架,但在使用过程中内置的数据类型不能满足以下两个需求,如下: time.Time类型返回的是 2023-10-03T09:12:08.5352808:00这种字符串…

基于Java的家政公司服务平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

在windows 10 里安装并设置了gvim 9.0

在windows 10 里安装并设置了gvim 9.0 。由于电脑里有联想软件商店,搜索vim,找到gvim 9.0 ,顺利安装了该软件。安装好以后,打开该软件,界面背景是白色,字体小。因此在网上搜索:设置gvim背景&…

Docker 的数据管理与Docker 镜像的创建

------------------Docker 的数据管理--------------------- 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 1.数据卷 数据卷是一个供容器使用的特殊…

FM5888协议系列-USB充电控制器 移动电源应用

产品描述: FM5888是一款USB快速充电控制IC,符合USB电池充电规范1.2版本,允许充电装置吸取的电流类似于使用原装充电器。FM5888可自动识别充电设备类型,支持多种智能手机,并通过对应的USB充电协议与设备握手&#xff0c…

Video Caption / 视频字幕:数据集总结

目录 一、背景 二、介绍 2.1 MSR-VTT 2.2 MSVD 2.3 VATEX 三、参考文献 一、背景 Video Caption / 视频字幕:常用指标(BELU-4,ROUGE-L,METEOR,CIDEr,SPICE)和数据集总结-CSDN博客Video C…

Windows照片查看器无法查看某些照片的解决方案

windows11中将默认的照片查看器替换成了Windows照片查看器,但是在查看某些手机截屏的照片时出现如下报错: Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满)&…