【设计模式】访问者模式

文章目录

  • 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);}@Overridepublic void run() {System.out.println("型号为"+type+"的CPU正在运行...");}@Overridepublic void accept(ComputerVisitor computerVisitor) {computerVisitor.visitCPU(this);}
}

硬盘

public class HardDisk extends Hardware {public HardDisk(String type) {super(type);}@Overridepublic void run() {System.out.println("型号为"+type+"的硬盘正在运行...");}@Overridepublic void accept(ComputerVisitor computerVisitor) {computerVisitor.visitHardDisk(this);}
}

创建电脑访问者抽象类

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

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

public class RunVisitor implements ComputerVisitor {@Overridepublic void visitCPU(CPU cpu) {cpu.run();}@Overridepublic void visitHardDisk(HardDisk hardDisk) {hardDisk.run();}
}
public class TypeVisitor implements ComputerVisitor {@Overridepublic void visitCPU(CPU cpu) {System.out.println("CPU型号:"+cpu.getType());}@Overridepublic 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.xdnf.cn/news/149784.html

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

相关文章

cartographer-(0)-ubuntu(20.04)-环境安装

1.安装 ROS wiki.ros.org 1.1修改镜像源: 到网站上找与操作系统相匹配的镜像源 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb htt…

JavaScript系列从入门到精通系列第十六篇:JavaScript使用函数作为属性以及枚举对象中的属性

文章目录 前言 1:对象属性可以是函数 2:对象属性函数被称为方法 一:枚举对象中的属性 1:for...in 枚举对象中的属性 前言 1:对象属性可以是函数 对象的属性值可以是任何的数据类型,也可以是函数。 v…

去雨去雪去雾算法之本地与服务器的TensorBoard使用教程

在进行去雨去雾去雪算法实验时,需要注意几个参数设置,num_workers只能设置为0,否则会报各种稀奇古怪的错误。 本地使用TensorBoard 此外,发现生成的文件是events.out.tfevents格式的,查询了一番得知该文件是通过Tens…

云原生边缘计算KubeEdge安装配置

1. K8S集群部署,可以参考如下博客 请安装k8s集群,centos安装k8s集群 请安装k8s集群,ubuntu安装k8s集群 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -n kube-system #修改kube-proxy#大约在40多行…

lv7 嵌入式开发-网络编程开发 12 IP协议与ethernet协议

目录 1 IP协议作用和意义 2 IP数据报首部格式 3 IP数据报分片 4 以太网协议作用和意义(链路层) 5 练习 1 IP协议作用和意义 IP网的意义 当互联网上的主机进行通信时,就好像在一个网络上通信一样,看不见互连的各具体的网络异…

Vue中实现自定义编辑邮件发送到指定邮箱(纯前端实现)

formspree里面注册账号 注册完成后进入后台新建项目并且新建表单 这一步完成之后你将得到一个地址 最后就是在项目中请求这个地址 关键代码如下: submitForm() {this.fullscreenLoading true;this.$axios({method: "post",url: "https://xxxxxxx…

golang gin框架1——简单案例以及api版本控制

gin框架 gin是golang的一个后台WEB框架 简单案例 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {//以json形式输出,还可以xml protobufc.JSON…

【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客 1 . 队列(Queue) 队列的概念和结构&#xf…

mysql面试题16:说说分库与分表的设计?常用的分库分表中间件有哪些?分库分表可能遇到的问题有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说说分库与分表的设计? 在MySQL中,分库与分表是常用的数据库水平扩展技术,可以提高数据库的吞吐量和扩展性。下面将具体讲解MySQL中分库与分表…

W25Q128芯片手册精读

文章目录 前言1. 概述2. 特性3. 封装类型和引脚配置3.1 8焊盘WSON 8x6 mm3.2其他封装 4. 引脚描述4.1 片选4.2 串行数据输入输出4.3 写保护4.4 保持脚4.5 时钟 5. 块图6. 功能描述6.1 SPI功能6.1.1 标准SPI6.1.2 双通道SPI6.1.3 四通道SPI6.1.4 保持功能 6.2 写保护6.2.1 写保护…

Python逐日填补Excel中的日期并用0值填充缺失日期的数据

本文介绍基于Python语言,读取一个不同的列表示不同的日期的.csv格式文件,将其中缺失的日期数值加以填补;并用0值对这些缺失日期对应的数据加以填充的方法。 首先,我们明确一下本文的需求。现在有一个.csv格式文件,其第…

C/C++——内存管理

1.为什么存在动态内存分配 灵活性 静态内存分配是在编译时确定的,程序执行过程中无法改变所分配的内存大小;动态内存分配可以根本程序的运行环境来动态分配和释放空间,提供了更大的灵活性 动态数据结构 有些数据结构的大小和结构在编译时…

隐式意图和Activity启动模式:实现文件打开应用【Android、隐式意图】

隐式意图和Activity启动模式:实现文件打开应用 在Android开发中,隐式意图和Activity启动模式是两个重要的概念。它们可以用于实现不同应用之间的协作和交互。在本篇博客中,我们将探讨如何创建一个Android应用,该应用可以从外部应…

IEEE802系列协议知识点总结

IEEE 802 协议包含了以下多种子协议。把这些协议汇集在一起就叫IEEE 802 协议集。 (1)IEEE802.1 IEEE 802.1协议提供高层标准的框架,包括端到端协议、网络互连、网络管理、路由选择、桥接和性能测量。 •IEEE 802.1d:生成树协议(Spanning Tree Protocol&#xff0c…

C++笔记之不同buffer数量下的生产者-消费者机制

C笔记之不同buffer数量下的生产者-消费者机制 文章目录 C笔记之不同buffer数量下的生产者-消费者机制0.在不同的缓冲区数量下,生产者-消费者机制的实现方式和行为的区别1.最简单的生产者-消费者实现:抄自 https://mp.weixin.qq.com/s/G1lHNcbYU1lUlfugXn…

基于虚拟阻抗的下垂控制——孤岛双机并联Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Oracle Database Express Edition (XE)配置与部署

获取下载安装包 https://www.oracle.com/cn/database/technologies/xe-downloads.htmlhttps://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html安装.rpm安装包 cd /usr/local/src wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-d…

Vue中如何进行分布式搜索与全文搜索(如Elasticsearch)

在Vue中实现分布式搜索与全文搜索(使用Elasticsearch) 分布式搜索和全文搜索在现代应用程序中变得越来越重要,因为它们可以帮助用户快速查找和检索大量数据。Elasticsearch是一种强大的分布式搜索引擎,它可以用于实现高性能的全文…

Gmail 将停止支持基本 HTML 视图

根据 Google 支持文档的更新内容,Gmail 将从明年 1 月起停止支持基本 HTML 视图。 ▲ Gmai 基本 HTML 视图界面 目前网页版 Gmail 提供两个界面:基本 HTML 视图和标准视图。停止支持基本 HTML 视图后,当前打开经典模式的基本 HTML 视图模式 …

苹果签名的MDM(Mobile Device Management)?是怎么做的?优势是什么?什么场合需要应用到?

苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到? 苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到? MDM&am…