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

embedded/2024/9/23 9:31:25/

文章目录

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

一、概述

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

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

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

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

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

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

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

  1. 首先是Modem层次结构。
java">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层次结构。
java">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. 最后是访问者的实际操作。
java">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.ppmy.cn/embedded/101652.html

相关文章

elementUI在事件中传递自定义参数

在使用ElementUI的时候&#xff0c;组件的事件会返回一些参数&#xff0c;有的时候我们想在这个事件中传入自己代码中的参数&#xff0c;因此在这里记录一下传递自定义参数的方式。 方式一&#xff1a;利用回调函数 // 闭包写法 <el-input v-model"input" place…

mysql中的explain居然也会骗人

直接甩张图&#xff0c;大家可以猜一下这个sql的执行时间 先提一嘴&#xff0c;bm表总共77条数据&#xff0c;而且没有大字段&#xff0c;字段数量也不多 explain中影响sql的关键 在 EXPLAIN 语句的输出中&#xff0c;影响 SQL 执行时间的关键项主要有以下几个&#xff1a; ty…

MYSQL——聚合查询

聚合查询就是一些MYSQL中的内置函数 聚合查询本质上是针对数据表中的行和行进行计算 函数说明count&#xff08;[DISTINCT]expr&#xff09;返回查询到的数据的数量&#xff0c;统计数据的行数sum&#xff08;[DISTINCT]expr&#xff09;返回查询到的数据的总和&#xff0c;不…

sap 开发工具 jdbc odbc 驱动 下载地址

SAP Development Tools (ondemand.com) sap 开发工具 jdbc odbc 驱动 下载地址

Langchain Memory组件深度剖析:从对话基础到高级链式应用

文章目录 前言一、Langchain memory 记忆1.Memory 组件基本介绍2.Memory 组件的类型1.ChatMessageHistory2.ConversationBufferMemory3.ConversationBufferWindowMemory4.ConversationEntityMemory5.ConversationKGMemory6.ConversationSummaryMemory 二、长时记忆1.简单介绍2.…

Java笔试面试题AI答之集合(6)

文章目录 31. 简述Java Set有哪些实现类&#xff1f;32. 简述Java哪些集合类是线程安全的 ?33. 简述ConcurrentHashMap和HashTable有什么区别 &#xff1f;1. 线程安全机制2. 支持null键和值3. 迭代器和分割器4. 性能和扩展性5. 初始化和默认参数总结 34. 简述HasmMap和HashSe…

《机器学习》 决策树 ID3算法

目录 一、什么是决策树&#xff1f; 1、概念 2、优缺点 3、核心 4、需要考虑的问题 二、决策树分类标准&#xff0c;ID3算法 1、什么是ID3 算法 2、ID3算法怎么用 1&#xff09;熵值计算公式 2&#xff09;用法实例 三、实操 ID3算法 1&#xff09;求出play标签的熵…

专题---自底向上的计算机网络(数据链路层)

目录 计算机网络概述 物理层 数据链路层 网络层 传输层 应用层 网络安全 集线器与交换机的主要区别。 ‌工作原理与层次‌&#xff1a;集线器工作在OSI模型的物理层&#xff0c;可以看作是1层设备&#xff0c;而交换机主要工作在数据链路层&#xff0c;可以看作是2层设备…