当前位置: 首页 > news >正文

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。
通过这种方式,元素的执行算法可以随着访问者改变而改变。
这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

访问者模式的核心组成部分包括:

抽象元素(Element):定义了一个接受访问者对象的方法,即accept()方法,用于调用访问者的操作。

具体元素(Concrete Element):实现了抽象元素接口,并实现了accept()方法,根据元素对象的类型选择相应的操作。

抽象访问者(Visitor):定义了访问者对象的接口,包含了对不同元素对象进行访问的方法。

具体访问者(Concrete Visitor):实现了抽象访问者接口,具体定义了对不同元素对象的访问操作。

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

增加新的操作非常方便:通过增加新的具体访问者类,可以非常方便地增加新的操作或算法,而无需修改现有的元素类。

将有关的行为集中到一个访问者中:通过将相似的操作集中到同一个访问者中,可以使得代码更加清晰、模块化和可维护。

良好的扩展性:在增加新的元素类时,只需要实现元素的接受访问者方法和具体访问者的相应操作,不需要修改其他类。

缺点:

1、具体元素对访问者公布细节,违反了迪米特原则。
2、具体元素变更比较困难。
3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

在这里插入图片描述

//5.对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,
// 通常由 List、Set、Map 等聚合类实现。
public class Computer implements ComputerPart {//组合模式:也可以用迭代器替换ComputerPart[] parts;public Computer(){parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      } @Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {for (int i = 0; i < parts.length; i++) {parts[i].accept(computerPartVisitor);}computerPartVisitor.visit(this);}
}// 组合模式+访问者模式
/** 抽象元素(Element)角色: 声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。*/
public interface ComputerPart {//要用  computerPartVisitor 对象来对当前的元素进行处理//ComputerPartVisitor是一个接口,有处理元素的方法.public void accept(ComputerPartVisitor computerPartVisitor);}
//抽象访问者(Visitor)角色:定义一个访问具体元素的接口,
// 为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
public interface ComputerPartVisitor {//访问者 处理每个具体的元素。public void visit(Computer computer);public void visit(Mouse mouse);public void visit(Keyboard keyboard);public void visit(Monitor monitor);
}
//具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {@Overridepublic void visit(Computer computer) {//TODO:具体的处理。。。System.out.println("Displaying Computer.");}@Overridepublic void visit(Mouse mouse) {//可以从mouse中取出具体对象的数据,进行相应的处理了.System.out.println("Displaying Mouse.");}@Overridepublic void visit(Keyboard keyboard) {System.out.println("Displaying Keyboard.");}@Overridepublic void visit(Monitor monitor) {System.out.println("Displaying Monitor.");}
}
//4.具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
public class Keyboard  implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
public class Monitor  implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
//具体的元素类:包装数据
public class Mouse  implements ComputerPart {//TODO:这里是每个类具体的数据@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);  //处理功能分开, 包装功能}
}
public class VisitorPatternDemo {public static void main(String[] args) {ComputerPart computer = new Computer();computer.accept(new ComputerPartDisplayVisitor());}
}

行文至此,关于二十三篇设计模式终于算是完结了,可能以后的日子我会将这二十三篇博客进行进一步的细化和归纳总结,也或许就这样了,这个得看我将来是否继续抽时候在此,或者是否在将来继续从事这个行业了,有了一定的经验,那么我将继续在此二十三篇设计模式上继续拓展和填写一些坑。
还是那句话,学无止境,编程这条路,一直学一直学,但是必须得专攻一个方向!!!

相关文章:

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。 通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接…...

月报总结|Moonbeam 7月份大事一览

炎炎夏日&#xff0c;Moonbeam于越南举办了线下交流会&#xff0c;在EthCC 2023和以太坊社区成员共同讨论多链应用&#xff0c;在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束&#xff0c;选出了每个赛道最杰出的项目&#…...

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …...

【2023】字节跳动 10 日心动计划——第四关

目录 1. 买卖股票的最佳时机2. 打家劫舍 II 1. 买卖股票的最佳时机 &#x1f517; 原题链接&#xff1a;121. 买卖股票的最佳时机 假设在第 i i i 天卖出股票可获得最大利润&#xff0c;那么买入股票必然是在前 i − 1 i-1 i−1 天中的某一天。更进一步&#xff0c;买入股票应…...

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…...

Emacs之设置行号前景颜色(字体颜色)/背景颜色/光标颜色/背景透明度(一百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

【hive经典指标,离线数仓指标,ADS层指标分析】最近7日内连续3日下单用户数

1.建表语句 DROP TABLE IF EXISTS ads_order_continuously_user_count; CREATE EXTERNAL TABLE ads_order_continuously_user_count (dt STRING COMMENT 统计日期,recent_days BIGINT COMMENT 最近天数,7:最近7天,order_continu…...

线上java程序CPU及内存占用过高问题排查总结

背景 最近发现线上的一个JAVA程序总是过段时间慢慢卡死&#xff0c;最后导致无法提供服务&#xff0c;外部请求接口超时。 经排查发现&#xff0c;该程序CPU及内存占用都很高&#xff0c;导致整个系统负载很高。 到这里&#xff0c;就想到了对程序内存进行分析。排查过程 查询…...

c高级:day3

作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…...

Java检查值是否存在于数组中的3种方法

在 Java 中&#xff0c;有许多方法可以检查此数组中是否存在特定元素。 1&#xff09;使用线性搜索方法 时间复杂度&#xff1a;O(N) 辅助空间&#xff1a;O(1) for (int element : arr) { if (element toCheckValue) { return true; } } 示例代码&#xff1a; import java.ut…...

python 连接oracle pandas以简化excel的编写和数据操作

python代码 Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-07-06 22:12:56 FilePath: \PythonProject02\pandas以简化excel的编写和数据操作.py Description: 这是默认设置,请设置customMade, 打开koro…...

Kubernetes高可用集群二进制部署(三)部署api-server

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…...

【网络|TCP】三次握手、四次握手

TCP是一种面向连接的可靠的传输协议&#xff0c;建立和断开TCP连接时需要进行握手的过程。其中&#xff0c;TCP的连接建立需要进行三次握手&#xff0c;而连接断开则需要进行四次握手。 解释 三次握手 第一次握手&#xff1a;客户端发送一个SYN&#xff08;同步&#xff09;报…...

刷题笔记 day7

力扣 209 长度最小的子数组 解法&#xff1a;滑动指针&#xff08;对同向双指针区间内的数据处理&#xff09; 1&#xff09;先初始化 两个指针 left &#xff0c;right。 2&#xff09;右移指针right的同时使用sum记录指针right处的值&#xff0c;并判断sum的值是否满足要求&…...

Tuxera NTFS2023Mac强大的Mac读写工具

Mac用户在使用NTFS格式移动硬盘时&#xff0c;会遇到无法写入硬盘的情况。要想解决无法写入的问题&#xff0c;很多人选择使用Mac读写软件。面对市面上“众多”的读写硬盘软件&#xff0c;用户应该怎么选择呢&#xff1f;初次接触移动硬盘的伙伴可能不知道移动硬盘怎么和电脑连…...

ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

文章目录 ARM 汇编宏介绍ARM 汇编宏的使用 下篇文章&#xff1a;ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章&#xff1a;ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL ARM 汇编宏介绍 在 ARM 汇编中&#xff0c;“.macro” 是用来定义一个宏的指…...

数据库的分库分表

#!/bin/bash ######################### #File name:db_fen.sh #Version:v1.0 #Email:admintest.com #Created time:2023-07-29 09:18:52 #Description: ########################## MySQL连接信息 db_user"root" db_password"RedHat123" db_cmd"-u${…...

[Docker实现测试部署CI/CD----相关服务器的安装配置(2)]

目录 6、Jenkins安装配置安装jdk安装maven拉取镜像启动jenkins修改数据卷权限浏览器访问安装插件配置jenkins移动JDK和Maven配置JDK和Maven 6、Jenkins安装配置 Jenkins 是一个开源软件项目&#xff0c;是基于 Java 开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&…...

LC-980. 不同路径 III(回溯)

980. 不同路径 III 难度困难291 在二维网格 grid 上&#xff0c;有 4 种类型的方格&#xff1a; 1 表示起始方格。且只有一个起始方格。 2 表示结束方格&#xff0c;且只有一个结束方格。 0 表示我们可以走过的空方格。 -1 表示我们无法跨越的障碍。 返回在四个方向&…...

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…...

Qwen3-14B GPU资源预测:基于历史负载的显存/CPU需求估算模型

Qwen3-14B GPU资源预测&#xff1a;基于历史负载的显存/CPU需求估算模型 1. 引言 在部署大型语言模型时&#xff0c;准确预测GPU资源需求是确保稳定运行的关键。本文将介绍如何基于历史负载数据&#xff0c;为Qwen3-14B模型构建显存和CPU需求的估算模型。这个预测方法特别适用…...

LaTeX科研论文排版:如何优雅地呈现SUNFLOWER MATCH LAB实验数据

LaTeX科研论文排版&#xff1a;如何优雅地呈现SUNFLOWER MATCH LAB实验数据 写科研论文&#xff0c;尤其是涉及复杂实验数据和模型结果的&#xff0c;最头疼的往往不是研究本身&#xff0c;而是如何把它们清晰、专业地呈现在纸上。你辛辛苦苦在SUNFLOWER MATCH LAB里跑出来的数…...

GitHub汉化插件终极指南:3分钟告别英文困扰,畅游中文GitHub世界

GitHub汉化插件终极指南&#xff1a;3分钟告别英文困扰&#xff0c;畅游中文GitHub世界 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese …...

SUNFLOWER MATCH LAB硬件对接:基于STM32F103C8T6最小系统板的图像采集端设计

SUNFLOWER MATCH LAB硬件对接&#xff1a;基于STM32F103C8T6最小系统板的图像采集端设计 最近在做一个植物生长监测的项目&#xff0c;需要部署一批低成本的图像采集终端。核心需求很简单&#xff1a;定时给植物拍照&#xff0c;然后把照片传到云端服务器。听起来不难&#xf…...

string的特性及使用

string这个词很容易让我们联想到str&#xff0c;也就是字符串&#xff0c;实际上string和字符串的关联性还是很强的。 很多字符串的题目都是string类的形式出现的&#xff0c;日常工作中为了方便使用都是用的string类&#xff0c; 标准string类 使用string类时&#xff0c;必须…...

问题解决策略基础算法实现训练1

问题 A&#xff1a; C 语言习题 字符串排序 [提交] [状态]题目描述 输入nnn个字符串&#xff0c;将它们按字母由小到大的顺序排列并输出。编写三个函数实现&#xff0c; 用于输出inputnnn个字符串&#xff0c; 用于排序sortstrnnn个字符串&#xff0c; 用于输出outputnnn个字符…...

OpenClaw学习助手:Qwen3.5-9B生成Anki记忆卡片与错题集

OpenClaw学习助手&#xff1a;Qwen3.5-9B生成Anki记忆卡片与错题集 1. 为什么需要AI驱动的学习助手&#xff1f; 作为一名经常需要记忆大量知识点的学生&#xff0c;我一直在寻找更高效的学习方法。传统的手工制作Anki卡片不仅耗时耗力&#xff0c;而且很难保证知识点的系统性…...

OpenClaw+Phi-3-mini-128k-instruct:自动化竞品分析报告生成器

OpenClawPhi-3-mini-128k-instruct&#xff1a;自动化竞品分析报告生成器 1. 为什么需要自动化竞品分析 作为一位连续创业者&#xff0c;我深知保持市场敏感度的重要性。每周手动检查竞品网站、整理产品更新、制作分析报告&#xff0c;这个过程既耗时又容易遗漏关键信息。直到…...

Bypass Paywalls Chrome Clean:突破付费内容壁垒的高效浏览器扩展

Bypass Paywalls Chrome Clean&#xff1a;突破付费内容壁垒的高效浏览器扩展 在信息爆炸的数字时代&#xff0c;优质内容常被付费墙阻隔&#xff0c;学术文献、深度报道和专业期刊的访问限制成为知识获取的主要障碍。Bypass Paywalls Chrome Clean作为一款开源浏览器扩展&…...

旧Mac设备重生指南:使用OpenCore Legacy Patcher升级系统全攻略

旧Mac设备重生指南&#xff1a;使用OpenCore Legacy Patcher升级系统全攻略 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果系统的不断更新&#xff…...