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

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

文章目录

  • 【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 {// 其他属性和方法...@Overridepublic 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 {// 其他属性和方法...@Overridepublic 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 {// 其他属性和方法...@Overridepublic void visit(Hayes hayes) {LOGGER.info(hayes + " used with Dos configurator.");}@Overridepublic void visit(Zoom zoom) {LOGGER.info(zoom + " used with Dos configurator.");}
}
public class ConfigureForUnixVisitor implements ZoomVisitor {// 其他属性和方法...@Overridepublic 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中的非循环访问者模式有了更深入的了解。在实际开发中,合理运用该模式可以提高代码的灵活性和可扩展性,同时降低代码的耦合性,为构建高质量的软件系统提供有力支持。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git下载安装配置
  • Apache + Tomcat + ajp 协议配置
  • Android13禁用Settings里面的Force Stop 強制停止按钮
  • 浏览器精度问题
  • Vue3常见知识**MS【4】
  • 【案例56】安全设备导致请求被拦截
  • 【PGCCC】PostgreSQL线程池技术揭秘:从原理到实战应用
  • Broadcast Hash Join
  • 【RabbitMQ】快速上手
  • linux内核驱动:pca953xIO扩展芯片驱动总结
  • Swift concurrency 3 — 三种异步方式(@escaping closure, Combine, async/await)
  • CAPL——定时器用法
  • Vue3:命名路由
  • 9-3 深度循环神经网络
  • 【微信小程序】全局数据共享 - MobX
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2017 年终总结 —— 在路上
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • exif信息对照
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • java8-模拟hadoop
  • leetcode386. Lexicographical Numbers
  • Linux后台研发超实用命令总结
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PhantomJS 安装
  • Python爬虫--- 1.3 BS4库的解析器
  • use Google search engine
  • 技术:超级实用的电脑小技巧
  • 手机端车牌号码键盘的vue组件
  • 微信支付JSAPI,实测!终极方案
  • 智能网联汽车信息安全
  • 说说我为什么看好Spring Cloud Alibaba
  • ​学习一下,什么是预包装食品?​
  • ​一些不规范的GTID使用场景
  • #Z2294. 打印树的直径
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (javaweb)Http协议
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (离散数学)逻辑连接词
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)为C# Windows服务添加安装程序
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET6 命令行启动及发布单个Exe文件
  • .vue文件怎么使用_我在项目中是这样配置Vue的