设计模式-Acyclic Visitor(非循环访问者模式)

news2025/1/19 20:34:39

目的:允许将新功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会有四人帮访客模式中那样循环依赖的问题。
类图在这里插入图片描述

使用场景
需要在现有层次结构中添加新功能而无需更改或影响该层次结构时。
当某些功能在层次结构上运行,但不属于层次结构本身时。 例如 ConfigureForDOS / ConfigureForUnix / ConfigureForX问题。
当您需要根据对象的类型对对象执行非常不同的操作时。
当访问的类层次结构将经常使用元素类的新派生进行扩展时。
当重新编译,重新链接,重新测试或重新分发派生元素非常昂贵时。
代码示例
1.创建解调器访问者接口(所有访问者的基类)和解调器抽象类(接口也可以)

public interface ModemVisitor {
/**
 ModemVisitor接口不包含任何访问方法,因此它不依赖于访问的层次结构。
    每个派生的访问方法都在其自己的访问者界面中声明   
*/
}

public abstract class Modem {
    public abstract void accept(ModemVisitor modemVisitor);
}

2.定义派生接口和类


@Slf4j
@Data
public class Zoom extends Modem {
    @Override
    public void accept(ModemVisitor modemVisitor) {
        if (modemVisitor instanceof  ZoomVisitor){
            ((ZoomVisitor) modemVisitor).visit(this);
        }else{
            log.info("Only ZoomVisitor is allowed to visit Zoom modem");
        }
    }
}

public interface ZoomVisitor extends ModemVisitor{
    void visit(Zoom zoom);
}


@Slf4j
@Data
public class Hayes extends Modem {
    @Override
    public void accept(ModemVisitor modemVisitor) {
        if (modemVisitor instanceof HayesVisitor){
            ((HayesVisitor) modemVisitor).visit(this);
        }else{
            log.info("Only HayesVisitor is allowed to visit Hayes modem");
        }
    }
}

public interface HayesVisitor extends ModemVisitor {
  void visit(Hayes hayes);
}

3.定义拓展接口

public interface AllModemVisitor extends HayesVisitor,ZoomVisitor{

}

4.拓展类实现(可选择性的实现)

@Slf4j
public class ConfigureForDosVisitor implements AllModemVisitor {

    @Override
    public void visit(Hayes hayes) {
        log.info(hayes+" used with configurator");
    }

    @Override
    public void visit(Zoom zoom) {
        log.info(zoom+" used with configurator");
    }
}


@Slf4j
public class ConfigureForUnixVisitor implements ZoomVisitor {
    @Override
    public void visit(Zoom zoom) {
      log.info(zoom+" used with unix configurator.");
    }
}

输出
Hayes() used with configurator
Zoom() used with unix configurator.
Only HayesVisitor is allowed to visit Hayes modem
Zoom() used with configurator

参考:https://java-design-patterns.com/

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

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

相关文章

Linux服务器远程访问通过Tomcat部署的静态资源

一、安装Java和Tomcat 1.1 安装Java 下载jdk8切换到root用户,创建文件夹/usr/local/java,将下载的jdk压缩包上传到该目录下,解压 mkdir /usr/local/java cd /usr/local/java rz tar -zxvf jdk-8u351-linux-x64.tar.gz编辑配置文件&#xf…

数据技术篇之数据服务

第6章 数据服务 1.服务架构演进 演进过程 DWSOA (1)实施原理   将业务方对数据的需求通过SOA服务的方式暴露出去。有需求驱动,一个需求开发一个或则几个接口,编写接口文档,开放给业务方调用。 (2&…

[附源码]Python计算机毕业设计SSM基于WEB的心理测评系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【手把手教你】使用qstock进行量化回测

01qstock简介qstock由“Python金融量化”公众号开发,试图打造成个人量化投研分析开源库,目前包括数据获取(data)、可视化(plot)、选股(stock)和量化回测(backtest)四个模块。其中数据模块(data&…

SAS中用单因素ANOVA研究不同疗法对焦虑症的有效性

本教程将介绍如何使用SAS进行单因素方差分析。 最近我们被客户要求撰写关于单因素ANOVA的研究报告,包括一些图形和统计输出。我们想研究不同疗法对焦虑症的有效性。我们收集了以下类别的75个主题的样本: 无处理(1个n1 27)。生物…

5W3H法与SMART原则的结合使用

5W3H 5W3H分析法,又称“八何分析法”。在实际工作中,人们常常运用5W3H分析法,进行顾客分析、市场需求分析,解决计划编制的结构问题、方向问题、执行力问题。 5W3H是描述问题的手段,其具体指的是:What&…

【图像处理】深入解析LBP算法

问题 LBP是一种常见的特征描述算法,用来提取局部的纹理特征,其原理其实很简单,下面我们就来看看它是怎么一回事吧。 LBP简介 LBP(Local Binary Patterns,局部二值模式)是一种很简单但很高效的局部纹理特…

2025年DMS前装搭载或突破750万辆!多方势力搅局「融合集成」

在智能驾驶功能和舱内人机交互体验不断融合演进的过程中,基于摄像头的DMS/OMS功能正在进入新的发展周期。而在欧洲等部分国家及地区,DMS的标配(主要涉及驾驶安全的监控,比如,驾驶员疲劳、注意力分散、安全带使用、吸烟…

java工厂策略模式的开发应用

java工厂策略模式的开发应用前言准备工作具体实现测试仰天大笑出门去,我辈岂是蓬蒿人前言 大概内容: 假设我有五个车间,每一个车间生产不同的车子,想要统一管理,不关心哪个车间生产什么车;只需找一个代理…

Ajax(一)

1.客户端与服务器 1.1 服务器 上网过程中,负责存放和对外提供资源的电脑。 1.2 客户端 上网过程中,负责获取和消费资源的电脑。 2.URL地址 2.1 URL地址的概念 2.2 URL地址的组成部分 3. 分析网页的打开过程 3.1 图解客户端与服务器的通信过程 三个…

NLP学习笔记(一) RNN基本介绍

大家好,我是半虹,这篇文章来讲循环神经网络 (Recurrent Neural Network, RNN) 文章行文思路如下: 首先通过前馈神经网络引出为啥需要循环神经网络然后介绍循环神经网络的核心思想与运作方式最后拓展两个循环神经网络常见且常用的变体 在讲循…

Windows 7恢复分区丢失了怎么恢复?

问题:Windows 7恢复分区丢失 戴尔、惠普和华硕等电脑制造商现会在他们的计算机上创建一个恢复分区。恢复分区允许用户在系统出现问题时将计算机恢复到出厂默认设置。但是,由于丢失了恢复分区,因此某些用户无法将电脑恢复到出厂设置。这是一个…

析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?

先回答标题中中的几个问题: 析构函数可以为纯虚函数吗? yes。纯虚函数可以有函数体吗? yes。纯虚函数需要函数体吗? 一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函…

Web前端大作业:基于bootstrap响应式页面,家具装修公司网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

最新版本APT漏洞利用工具箱

点击"仙网攻城狮”关注我们哦~不当想研发的渗透人不是好运维让我们每天进步一点点简介1.最近发现一个好用的渗透工具箱,基本包含最新热门漏洞exp,分享一下项目地址:https://github.com/White-hua/Apt_t00ls环境:jdk1.8如果双…

【深度学习】PyTorch深度学习实践 - Lecture_11_Advanced_CNN

文章目录一、GoogLe Net1.1 网络结构1.2 Inception Model1.3 11 Convolution1.4 PyTorch-GPU 实现 GoogLe Net二、Residual Net2.1 梯度消失和梯度爆炸2.2 残差模块2.3 PyTorch-GPU 实现 Simple Residual Net2.3.1 整体结构2.3.2 残差块对象2.3.3 残差网络对象2.3.4 完整代码三…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.7 案例实现TCC 模式【分析】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.7 案例实现TCC 模式【分析】38.7.1 实现TCC 模式38.7.2 TCC 的空回滚 和业务悬挂38…

Redis框架(八):大众点评项目 逻辑过期时间处理缓存击穿

大众点评项目 逻辑过期时间处理缓存击穿需求:逻辑过期时间处理缓存击穿业务实现总结SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代…

七分钟教会你如何编写一个合格的测试用例

目录 1、测试用例的基本要素 2、根据测试用例去测试带来的好处 3、测试用例的设计方法 3.1、等价类 3.2、边界值 3.3、错误猜测法 3.4、场景法 3.5、因果图法 3.6、正交排列 4、怎样判断一个测试用例是好的测试用例 1、测试用例的基本要素 测试用例是为了实施测试而向…

基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…