设计模式行为模式-访问者模式

news2024/12/24 9:38:45

文章目录

  • 介绍
  • 基本原理
    • 1. 定义访问者模式
    • 2. 角色及其职责
      • 2.1 元素(Element)
      • 2.2 具体元素(ConcreteElement)
      • 2.3 访问者(Visitor)
      • 2.4 具体访问者(ConcreteVisitor)
      • 2.5 对象结构(Object Structure)
    • 3. 访问者模式的工作流程
  • 适用场景
    • 1. 对象结构稳定,但需要经常增加新的操作
    • 2. 处理复杂的对象结构,并对不同元素进行不同操作
    • 3. 需要在不改变元素类的情况下添加新的操作
  • 优缺点
    • 1. 优点
  • 适用案例
    • 访问者模式可以用于AOP(面向切面编程)
  • 总结

介绍

  • 概述访问者模式:访问者模式是一种行为型设计模式,它将数据结构与对数据的操作分离,从而实现操作的独立性和扩展性。
  • 访问者模式的作用和优势:访问者模式可以处理复杂的对象结构,使得新增操作简单且不影响已有元素类。

基本原理

1. 定义访问者模式

访问者模式定义了一组角色及其相应职责,包括元素、具体元素、访问者、具体访问者和对象结构。
在这里插入图片描述

2. 角色及其职责

2.1 元素(Element)

元素是访问者模式中的一个角色,它定义了一个接受访问者对象并调用访问者对象对自身进行操作的方法。元素可以是一个类或接口,其中包含accept(visitor)方法。

2.2 具体元素(ConcreteElement)

具体元素是元素的实现类,它实现了元素接口,并提供了具体的操作方法。每个具体元素都会实现accept(visitor)方法,将自身传递给访问者对象。

2.3 访问者(Visitor)

访问者是访问者模式中的另一个角色,它定义了对具体元素的操作方法。访问者可以是一个接口或抽象类,其中定义了一系列以具体元素作为参数的操作方法。

2.4 具体访问者(ConcreteVisitor)

具体访问者是访问者的实现类,它实现了访问者接口,并针对每个具体元素提供了相应的操作方法。每个具体访问者都能够处理特定类型的具体元素。

2.5 对象结构(Object Structure)

对象结构是访问者模式的一个重要组成部分,它存储了要被访问的对象集合,并提供了遍历元素的方法。对象结构可以是一个类或接口,通常使用容器(如列表或树)来管理元素和访问者的关系。

在访问者模式中,具体元素通过accept(visitor)方法将自身传递给访问者对象,让访问者对象根据具体元素的类型调用相应的操作方法。这种方式实现了元素与操作的解耦,使得新增操作变得简单而无需修改已有元素类。同时,访问者模式还提供了一种统一的访问方式,方便对复杂对象结构进行操作和扩展。

3. 访问者模式的工作流程

访问者模式的工作流程如下:

  1. 定义一个对象结构(Object Structure),用于存储要被访问的对象集合。这个对象结构可以是一个类或接口。
  2. 在对象结构中提供一个遍历元素的方法,通常是通过迭代器或递归来实现。
  3. 定义一个元素接口(Element),其中包含一个accept(visitor)方法。
  4. 实现具体元素(Concrete Element)类,实现元素接口,并在accept(visitor)方法中将自身传递给访问者对象。
  5. 定义一个访问者接口(Visitor),其中声明了对每个具体元素进行操作的多个方法。
  6. 实现具体访问者(Concrete Visitor)类,实现访问者接口,并实现对具体元素的操作方法。
  7. 在客户端代码中,创建对象结构和具体元素的实例,并调用对象结构的遍历方法。
  8. 在遍历过程中,每个元素通过accept(visitor)方法将自身传递给具体访问者对象,让访问者对象根据元素的类型调用相应的操作方法。

通过以上流程,访问者模式实现了对对象结构中元素的遍历和操作的分离,使得新增操作变得简单且不影响已有元素类。同时,访问者模式还提供了一种统一的访问方式,便于操作和扩展复杂对象结构。

适用场景

1. 对象结构稳定,但需要经常增加新的操作

当对象结构稳定,但经常需要对其进行新的操作时,使用访问者模式可以方便地添加新的操作,无需修改已有元素类。

2. 处理复杂的对象结构,并对不同元素进行不同操作

访问者模式适用于处理复杂的对象结构,其中不同类型的元素需要进行不同的操作。

3. 需要在不改变元素类的情况下添加新的操作

通过新增具体访问者类来添加新的操作,而无需修改元素类,从而实现对对象结构的扩展。

优缺点

1. 优点

  • 分离数据结构与操作,提高灵活性和可扩展性。
  • 新增操作简单,无需修改元素类。
  • 提供一种统一的访问方式,便于操作和扩展复杂对象结构。

##2. 缺点

  • 增加新的元素类较困难,需要修改访问者接口和所有具体访问者类。
  • 增加新的访问者类较困难,需要修改元素类的接口。

适用案例

访问者模式可以用于AOP(面向切面编程)

以下是一个使用访问者模式实现AOP的示例:

首先,我们定义切面逻辑(Visitor)和被切对象(Element):

// 切面逻辑 Visitor 接口
public interface Visitor {
    void visit(Element element);
}

// 被切对象 Element 接口
public interface Element {
    void accept(Visitor visitor);
}

然后,我们实现具体的切面逻辑和被切对象:

// 具体切面逻辑 Visitor 实现类
public class LoggingVisitor implements Visitor {
    @Override
    public void visit(Element element) {
        // 在这里实现切面逻辑
        System.out.println("Logging: 切入点" + element.toString());
    }
}

// 具体被切对象 Element 实现类
public class ConcreteElement implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    // 被切对象的具体方法
    public void operation() {
        System.out.println("正常执行逻辑");
    }
}

最后,我们在客户端代码中使用访问者模式:

public class Client {
    public static void main(String[] args) {
        // 创建切面逻辑 Visitor 对象
        Visitor visitor = new LoggingVisitor();

        // 创建被切对象 Element 对象
        Element element = new ConcreteElement();

        // 被切对象接受切面逻辑
        element.accept(visitor);

        // 调用被切对象的方法
        ((ConcreteElement) element).operation();
    }
}

通过上述示例代码,我们实现了一个简单的AOP示例,使用访问者模式将切面逻辑和被切对象解耦,并在被切对象的特定点上执行切面逻辑。注意,在实际使用中,AOP通常需要结合其他框架或库,例如Spring AOP,在更复杂的场景下进行配置和管理。此处的示例只是用于演示访问者模式在AOP中的应用。
在这里插入图片描述

总结

结合AOP(面向切面编程)的业务,访问者模式可以用来实现动态的AOP切入。

AOP主要关注在程序运行期间对横切关注点(如日志记录、性能监测、事务管理等)的处理。使用访问者模式可以将这些横切关注点抽象为访问者对象,被切入的对象则作为元素对象。通过访问者模式,可以实现以下效果:

  1. 分离核心业务逻辑与横切关注点:将核心业务逻辑封装在元素对象中,而将横切关注点封装在访问者对象中。

  2. 动态添加新的关注点:当需要新增一种横切关注点时,只需要创建一个新的访问者对象并实现相应的逻辑,而不需要修改已有的元素对象。

  3. 实现可插拔的切面逻辑:通过切换不同的访问者对象,可以在运行时决定执行哪些横切关注点,从而实现动态的AOP切入。

  4. 提高代码的可维护性和灵活性:将不同横切关注点的处理逻辑封装在访问者对象中,使得代码结构更加清晰,并且可以灵活地组合和拆分横切关注点。

  5. 遵循开闭原则与单一职责原则:通过添加新的访问者对象,可以在不修改已有代码的情况下扩展业务逻辑,并且每个访问者对象只负责执行特定的关注点逻辑,符合单一职责原则。

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

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

相关文章

D-Link DCS 密码泄露漏洞

0x01 前言 本次测试仅供学习使用,如若非法他用,与本文作者无关,需自行负责!!! 0x02 漏洞描述 D-link DCS是一款成像色彩为彩色 是一款网络摄像机。D-link DCS系统存在密码泄露漏洞,攻击者通过…

什么牌子的电容笔比较好?适合学生党的电容笔推荐

如今,几乎人手一部iPad平板,它能帮大家解决许多工作、学习方面的问题,例如在工作中整理文件,制作一些简单的PPT。因此,给iPad平板配上一个好的电容笔就显得尤为重要了。在此,我向各位安利一些又好用又便宜的…

【数据结构】多叉树转换为二叉树-c++代码实现-POJ 3437 Tree Grafting

文章目录 写这个题目的原因寻找提交网址题目解决思路AC代码成功AC 写这个题目的原因 1、今天在看王道考研数据结构的课(虽然我要保研,但是因为这些看保研面试的时候会问,所以看一下嘞orz),看到了这个多叉树转换为二叉…

微信黑名单怎么恢复好友?1分钟教你找回消失的“他”

微信的【黑名单】功能可以屏蔽掉一些令大家分心或者浪费时间的人。这个功能有利于减少干扰、保护隐私,并且还能大大提高用户的社交体验。 但是,有时候大家可能会因为发生冲突而将对方暂时拉入黑名单。在问题得到解决后却又希望恢复与他的联系。那么&…

Seata整合nacos,Postgresql 为DB存储

Seata整合nacos,Postgresql 为DB存储 环境 详情环境可参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 我这里 <spring.cloud.alibaba-version>2021.1</spring.cloud.alibaba-version>所有选择seata版本为 1…

模拟实现应用层协议

模拟实现应用层协议 文章目录 模拟实现应用层协议应用层再谈协议 序列化和反序列化 网络版计算器自定义协议利用Json进行序列化和反序列化json库的安装条件编译 应用层 应用层&#xff08;Application layer&#xff09;是OSI模型的第七层。应用层直接和应用程序接口并提供常见…

CountDownLatch详解——深入探究CountDownLatch源码

这篇文章将会详细介绍CountDownLatch这个并发类&#xff0c;通过深入底层源代码讲解其具体实现。 /*** A synchronization aid that allows one or more threads to wait until* a set of operations being performed in other threads completes.*/ 上面是CountDownLatch这个…

对SAE的测评报告

对SAE的测评报告&#xff1a; 很高兴在这里跟大家分享我对SAE产品的测评体验&#xff0c;以下我将通过实验以及本期话题的问题这两个方面带领大家走进SAE&#xff1a; 产品介绍&#xff1a; Serverless应用引擎SAE是一款极简易用、自适应弹性的容器化应用平台。它提供全托管…

C++ 动态多态(虚函数)

所谓动态多态即&#xff0c;在运行过程中&#xff0c;会随参数的变化而展现不同的功能&#xff0c;其关键原理便是虚函数&#xff0c;与之对应的静态多态便是函数重载。 虚函数&#xff0c;即当存在与虚函数一样的函数&#xff0c;即返回值&#xff0c;函数名&#xff0c;参数等…

【毕业设计】基于SSM的电子图书分享系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;本系统结构简单&#xff0c;容易理解&#xff01;本系统功能结构完整&#xff0c;非常高适…

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图…

基于STM32的甲醛浓度检测报警仿真设计(仿真+程序+讲解)

仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0083 甲醛浓度检测报警仿真 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 1.主要功能 功能说明&#xff1a; 1、以STM32单片机和控制核心设计甲醛浓度检测报警设计&…

Kubernetes技术--使用kubeadm快速部署一个K8s集群

这里我们配置一个单master集群。(一个Master节点,多个Node节点) 1.硬件环境准备 一台或多台机器,操作系统 CentOS7.x-86_x64。这里我们使用安装了CentOS7的三台虚拟机 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 2.主机名称和IP地址规划 3. 初始化准备工作…

15.MyCat数据库分片

MyCat 是一个开源的数据库中间件&#xff0c;主要用于将数据库操作请求路由和分发到后端的多个数据库节点。 1.Mycat环境搭建 在两个不同数据库中创建相同表 下载mycat https://github.com/MyCATApache/Mycat-Serverhttps://github.com/MyCATApache/Mycat-Server 将下…

【线程同步】AQS抽象排队同步器(AbstractQueuedSynchronizer)

AQS(AbstractQueuedSynchronizer)抽象排队同步器 AbstractQueuedSynchronizer AQS就是AbstractQueuedSynchronizer类 AQS其实就是JUC包下的一个基类&#xff0c;JUC下的很多内容都是基于AQS实现了部分功能&#xff0c;比如ReentrantLock&#xff0c;ThreadPoolExecutor&#…

十二、集合(1)

本章概要 泛型和类型安全的集合基本概念 如果一个程序只包含固定数量的对象且对象的生命周期都是已知的&#xff0c;那么这是一个非常简单的程序。 通常&#xff0c;程序总是根据运行时才知道的某些条件去创建新的对象。在此之前&#xff0c;无法知道所需对象的数量甚至确切类…

热烈祝贺蜀益表面处理成功入选航天系统采购供应商库

经过航天系统采购平台的严审&#xff0c;眉山市蜀益表面处理科技有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企…

Simulink建模与仿真(3)-Simulink 简介

分享一个系列&#xff0c;关于Simulink建模与仿真&#xff0c;尽量整理成体系 1、Simulink特点 Simulink是一个用来对动态系统进行建模、仿真和分析的软件包。使用Simulink来建模、分析和仿真各种动态系统(包括连续系统、离散系统和混合系统)&#xff0c;将是一件非常轻松的事…

natApp内网穿透工作原理

如图所示&#xff0c;用户启动内网穿透工具会将token传入natapp服务器与我们自己的主机建立一个类似于websocket的长链接&#xff0c;当从外网访问我们主机的接口时&#xff0c;会进行一个本地接口地址的截取&#xff0c;然后进行拼接成我们主机应用的真实地址。然后将数据返回…

AntDesign 自定义图片上传前端压缩画质

为什么压缩图片&#xff1f; 应为现在公司没有使用云数据库 从而为了减少服务器的消耗需要将用户上传的图片压缩 前端压缩图片的技术选择&#xff01; 查阅资料发现当下两种压缩的方法&#xff01;&#xff01;第一种使用工具库实现 npm install image-conversion --save 第…