【Java设计模式】非循环访问者模式:简化对象交互

news2024/9/25 11:22:38

文章目录

  • 【Java设计模式】非循环访问者模式:简化对象交互
    • 一、概述
    • 二、非循环访问者设计模式的意图
    • 三、非循环访问者模式的详细解释及实际示例
    • 四、Java中非循环访问者模式的编程示例
    • 五、非循环访问者模式类图
    • 六、Java中何时使用非循环访问者模式
    • 八、非循环访问者模式的优点和权衡
    • 十一、源码下载

【Java设计模式】非循环访问者模式:简化对象交互

一、概述

在Java开发中,设计模式是提高代码质量和可维护性的重要工具。本文将介绍非循环访问者模式(Acyclic Visitor Pattern),包括其意图、详细解释、编程示例、类图、适用场景、教程、优点和权衡以及相关设计模式。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

二、非循环访问者设计模式的意图

Java中的非循环访问者模式将操作从对象层次结构中解耦,为各种应用提供了灵活的设计。

三、非循环访问者模式的详细解释及实际示例

  1. 实际示例
    • 一个类似的现实世界中的非循环访问者模式的例子是博物馆导游系统,展示了这种设计模式的实际应用。想象一个博物馆,里面有各种展品,如绘画、雕塑和历史文物。博物馆有不同类型的导游(音频导游、人工导游、虚拟现实导游),它们为每个展品提供信息。每当引入新的导游类型时,不是修改展品,而是每个导游实现一个接口来访问不同的展品类型。这样,博物馆可以添加新类型的导游,而无需更改现有的展品,确保系统保持可扩展性和可维护性,而不会形成任何依赖循环。
  2. 通俗解释
    • 非循环访问者模式允许在不修改现有类层次结构的情况下向其添加功能。
  3. Wiki解释
    • 非循环访问者模式允许向现有的类层次结构添加新功能,而不会影响这些层次结构,并且不会创建GangOfFour访问者模式中固有的依赖循环。

四、Java中非循环访问者模式的编程示例

在这个Java示例中,我们有一个调制解调器类的层次结构,展示了非循环访问者模式。这个层次结构中的调制解调器需要根据过滤标准(是否与Unix或DOS兼容的调制解调器)被外部算法访问。

  1. 首先是Modem层次结构。
public abstract class Modem {
    public abstract void accept(ModemVisitor modemVisitor);
}
public class Zoom extends Modem {
    // 其他属性和方法...
    @Override
    public void accept(ModemVisitor modemVisitor) {
        if (modemVisitor instanceof ZoomVisitor) {
            ((ZoomVisitor) modemVisitor).visit(this);
        } else {
            LOGGER.info("Only ZoomVisitor is allowed to visit Zoom modem");
        }
    }
}
public class Hayes extends Modem {
    // 其他属性和方法...
    @Override
    public void accept(ModemVisitor modemVisitor) {
        if (modemVisitor instanceof HayesVisitor) {
            ((HayesVisitor) modemVisitor).visit(this);
        } else {
            LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem");
        }
    }
}
  1. 接下来是ModemVisitor层次结构。
public interface ModemVisitor {
}
public interface HayesVisitor extends ModemVisitor {
    void visit(Hayes hayes);
}
public interface ZoomVisitor extends ModemVisitor {
    void visit(Zoom zoom);
}
public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {
}
public class ConfigureForDosVisitor implements AllModemVisitor {
    // 其他属性和方法...
    @Override
    public void visit(Hayes hayes) {
        LOGGER.info(hayes + " used with Dos configurator.");
    }
    @Override
    public void visit(Zoom zoom) {
        LOGGER.info(zoom + " used with Dos configurator.");
    }
}
public class ConfigureForUnixVisitor implements ZoomVisitor {
    // 其他属性和方法...
    @Override
    public void visit(Zoom zoom) {
        LOGGER.info(zoom + " used with Unix configurator.");
    }
}
  1. 最后是访问者的实际操作。
public static void main(String[] args) {
    var conUnix = new ConfigureForUnixVisitor();
    var conDos = new ConfigureForDosVisitor();
    var zoom = new Zoom();
    var hayes = new Hayes();
    hayes.accept(conDos); // Hayes调制解调器与Dos配置器
    zoom.accept(conDos); // Zoom调制解调器与Dos配置器
    hayes.accept(conUnix); // Hayes调制解调器与Unix配置器
    zoom.accept(conUnix); // Zoom调制解调器与Unix配置器   
}

程序输出:

09:15:11.125 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Hayes modem used with Dos configurator.
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Zoom modem used with Dos configurator.
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.Hayes -- Only HayesVisitor is allowed to visit Hayes modem
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForUnixVisitor -- Zoom modem used with Unix configurator.

五、非循环访问者模式类图

在这里插入图片描述

六、Java中何时使用非循环访问者模式

该模式可用于以下情况:

  1. 当需要向现有层次结构添加新功能,而无需更改或影响该层次结构时。
  2. 当有一些函数在层次结构上操作,但不属于该层次结构本身时。例如,ConfigureForDOS / ConfigureForUnix / ConfigureForX问题。
  3. 当需要根据对象的类型对其执行非常不同的操作时。
  4. 当被访问的类层次结构将经常用Element类的新派生类扩展时。
  5. 当Element的派生类的重新编译、重新链接、重新测试或重新分发非常昂贵时。

八、非循环访问者模式的优点和权衡

  1. 优点
    • 可扩展:可以轻松添加新操作,而无需更改对象结构。
    • 解耦:减少了对象与对它们的操作之间的耦合。
    • 无依赖循环:确保无环依赖,提高了可维护性并降低了复杂性。
  2. 权衡
    • 增加复杂性:可能会因为需要多个访问者接口而引入额外的复杂性。
    • 维护开销:修改对象层次结构需要更新所有访问者。

十一、源码下载

https://download.csdn.net/download/weixin_42545951/89679437

通过本文的介绍,相信大家对Java中的非循环访问者模式有了更深入的了解。在实际开发中,合理运用该模式可以提高代码的灵活性和可扩展性,同时降低代码的耦合性,为构建高质量的软件系统提供有力支持。

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

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

相关文章

XTuner微调个人小助手认知 #书生浦语大模型实战营#

1.任务: 本次的任务是使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知,从而让模型能够个性化的回复,让模型知道他是我们的小助手,在实战营帮我们完成XTuner微调个人小助手认知的任务。并截图打卡。 任务打卡&#x…

深入探索【Hadoop】生态系统:Hive、Pig、HBase及更多关键组件(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Hadoop 2、Hadoop生态系统的构成概览 二…

【html+css 绚丽Loading】 000019 五行轮回剑

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f495…

【云原生】Mysql 集群技术

PS:MySQL的源码编译进行实验环境操作 1、MySQL安装及初始化 (1)生成启动脚本 (2) 修改环境变量 (3)生成配置文件 (4)数据库初始化建立mysql基本数据 (5&…

UnrealEngine学习(03):虚幻引擎术语

1. 项目 虚幻引擎5项目(Unreal Engine 5 Project) 中包含游戏的所有内容。项目中包含的大量文件夹都在磁盘上,例如 Blueprints 和 Materials 。你可以按照自己的意愿命名文件夹并将其整理到项目中。虚幻编辑器(Unreal Editor&…

云网络/云探测+零信任架构初阶知识扫盲

一、关键(边界)节点 1、边界 (1)CiscoASA Firepower 思科 Firepower NGFW(下一代防火墙)是专注于威胁防御的下一代防火墙,它将多种功能完全集于一身,采用统一管理,可在…

荣耀应用商城——被下架应用申诉指南

申诉背景 为了营造良好的荣耀应用市场生态环境,保障开发者权益及提升用户体验,此流程针对应用被下架后开发者后续的具体申诉操作流程及详细介绍。 该流程适用于开发者在荣耀应用市场提交的应用,且应用当前处于被下架状态。 申诉流程 申诉定义…

PHP概述-环境搭建-开发工具安装

老师建议注册使用百度文心一言;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个,也可下载文心一言、讯飞星火、kimi等APP软件使用,对于我们在读的大二学生来说有什么…

XR虚拟拍摄和VP有什么区别

XR 虚拟拍摄技术最早源于舞台屏当中,当前衍生出“VP 虚拟制片”、“XR 扩展现实"两大类: 扩展现实(xR)拍摄,扩展是指LED屏以外区域在画面中被虚拟图形所覆盖,扩展无限的虚拟空间;现实是指LED屏为导演和演员提供肉…

51、Python之模块和包:Python的包和文件夹有何区别

引言 大学有云:“苟日新,又日新,日日新”。 看到一些教材或者文章,介绍到包的时候,一定会提到一定要在文件夹中新建一个__init__.py的文件,哪怕空文件也可以…… 我只想说,有些人的知识真的是…

等保测评与企业风险管理:构建坚实的信息安全防线

随着信息技术的飞速发展,企业在数字化转型的道路上高歌猛进。然而,随之而来的信息安全威胁也日益严峻,成为制约企业发展的关键因素。为了确保信息系统安全,等保测评作为一种重要的风险管理手段,正逐渐成为企业构建信息…

Automatic Educational Question Generation with Difficulty Level Controls

文章目录 题目摘要简介相关工作问题表述实验用户研究结论 题目 具有难度级别控制的自动教育问题生成 论文地址:https://link.springer.com/chapter/10.1007/978-3-031-36272-9_39 摘要 我们考虑自动生成各种难度的数学应用题 (MWP),以满足教师在相应教育阶段教学和…

Java 使用 POI 导出Excel,实现单元格内容为下拉选项

在使用Apache POI的库生成Excel导入模板的时候,有时候需要设置某些列只能选择下拉选项中的内容,该如何实现这个特性呢?下面是一个示例代码,演示如何实现单元格只能从下拉中选择内容。 代码 import org.apache.poi.ss.usermodel.*…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目,什么都是一知半解。使用Vue,创建Cesium项目的时候,提示需要选择一个模版(如下图所示),该如何选择项目模版选,总结如下: 模版说明…

共源级PMOS反向串联电路分析

一、共源级PMOS反向串联结构如下图: 二、具体分析 1、当VBUS_EN拉低,三极管Q5截止: 如果V-BUS>GEN_5V, T3体二极管阴极电压大于阳极电压,T3体二极管截止。由于上拉电阻R24将S端电压向G端极间电容充电,使得VgVs&…

【机器学习】探秘图像处理与分类:运用C++结合OpenCV实现智能视觉识别技术

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 在计算机视觉领域,图像处理与分类是核心任务之一。OpenCV作为一个功能强大的开源计算机视觉库,提供…

【搜索引擎】ElasticSearch 7.x版本

1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 全文搜索引擎 1.3 Elasticsearch And Solr 1.4 Elasticsearch Or Solr 1.5 Elasticsearch应用案例 2 Elassticsearch入门 2.1 Elasticsearch 安装 2.1.1 下载软件 2.1.2 安装软件 2.1.3 问题解决 2.2 Elasticsearch基本操…

【网络基础】DNS协议详解:从背景到解析过程及`dig`工具的使用

文章目录 DNS 协议① 前言 - 背景② 域名③ DNS解析过程④ Linux下用dig工具 分析DNS过程⑤ 浏览器中输入URL后,会有哪些过程 DNS 协议 DNS(域名系统,Domain Name System)是互联网的一个核心协议,用于将域名转换为 IP…

有一种“穷人性格”,大事拎不清,小事算太精

在生活的舞台上,人们各自演绎着不同的人生故事。而有一种性格特征,常常被视为与经济困境紧密相连,那就是“大事拎不清,小事算太精”的所谓“穷人性格”。这种性格不仅在个体层面影响着人们的生活轨迹,也在一定程度上反映了社会现象背后的深层次问题。 一、“穷人性格”的表…

读软件开发安全之道:概念、设计与实施10安全设计审查

1. 安全设计审查 1.1. Security Design Review,SDR 1.2. 将安全性融入软件设计的最佳方法之一是戴上“安全帽”进行单独的设计审查 1.3. 安全审查员是熟悉软件运行的系统和环境,以及知道如何使用它的人,但他们不参与设计工作,这…