03-JAVA设计模式-访问者模式

访问者模式

什么是访问者模式

访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。

在访问者模式中,我们定义了两个主要角色:

  • 访问者(Visitor): 这个接口声明了一个访问元素的方法,这个方法的名字和参数表示了访问操作。
  • 元素(Element): 这是一个定义了接受访问者(accept)方法的接口。这个方法的名字和参数表示了被访问的操作。
  • 具体元素(ConcreteElement): 实现元素接口,并存储数据。同时,它实现接受操作,通常是通过调用访问者的访问方法。
  • 具体访问者(ConcreteVisitor): 实现访问者接口,并定义了对特定元素的访问操作。
  • 对象结构(Object Structure): 通常包含元素的集合,并提供一个方法,使得访问者可以访问其元素。

常见应用场景:

  • XML文档解析器设计
  • 编译器的设计
  • 复杂集合对象的处理

访问者模式表示一个作用于某对象结构中的各个元素的操作,他是我们可以在不改变各个元素的类的前提下定义作用域这些元素的新操作。
实际开发中应用范围非常窄。

示例

Element.java

// 元素接口
public interface Element {void accept(Visitor visitor);
}

Visitor.java

// 访问者接口
public interface Visitor {void visit(ConcreteElementA elementA);void visit(ConcreteElementB elementB);
}

ConcreteElementA.java

// 具体元素A
public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public void operationA() {System.out.println("Element A: operationA()");}}

ConcreteElementB.java

// 具体元素B
public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public void operationB() {System.out.println("Element B: operationB()");}
}

ConcreteVisitor.java

// 具体访问者
public class ConcreteVisitor  implements Visitor {@Overridepublic void visit(ConcreteElementA elementA) {elementA.operationA();System.out.println("Visited Element A");}@Overridepublic void visit(ConcreteElementB elementB) {elementB.operationB();System.out.println("Visited Element B");}
}

ObjectStructure.java

import java.util.ArrayList;
import java.util.List;// 对象结构
public class ObjectStructure {private List<Element> elements = new ArrayList<>();public void attach(Element element) {elements.add(element);}public void detach(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}

TestClient.java

// 测试
public class TestClient {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.attach(new ConcreteElementA());objectStructure.attach(new ConcreteElementB());ConcreteVisitor visitor = new ConcreteVisitor();objectStructure.accept(visitor);}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

数据结构 - 链表详解二 - 无头单向非循环链表

一. 单链表的介绍 上篇文章已经介绍了各种链表的概念了&#xff0c;这篇文章就带大家来实现一下无头单向非循环链表 无头单向非循环链表是一种简单而基本的链表结构&#xff0c;它没有哨兵或额外的头节点来简化操作&#xff0c;且不形成闭环。这种链表直接从首个数据节点开始&…

图文教程 | Git安装配置、常用命令大全以及常见问题

前言 因为多了一台电脑&#xff0c;平时写一些代码&#xff0c;改一些文件&#xff0c;用U盘存着转来转去特别麻烦。于是打算用Git管理我的文件&#xff0c;方便在两个终端之间传输数据啥的。也正好给新电脑装好Git。 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &…

HFSS端口介绍2---波端口

前面我们讨论了Lumped Port设定相关的内容,这节我们继续讨论Wave Port(波端口)使用相关的问题。 波端口使用范围 封闭结构:如波导、同轴电缆等 包含多个传播模式的模型 端口平面在求解区域外的模型 模型中包含均匀的波导或者传输线结构 波端口的大小 对于封闭的传输线结构:边…

Ajax技术是啥?在web开发中有啥用?

一、Ajax是啥&#xff1f; Ajax技术是一种让网页能在不完全刷新页面的情况下&#xff0c;通过JavaScript与服务器进行异步数据交换&#xff0c;并更新部分网页内容的技术。 简单来说&#xff0c;Ajax的核心原理就是在JavaScript的控制下&#xff0c;网页悄悄地向服务器请求数…

Kubeedge:edgecore源码速读

Kubeedge源码版本&#xff1a;v1.15.1 首先&#xff0c;我们从edgehub的start函数看起&#xff1a; 它主要干几件事情&#xff1a; 初始化证书相关&#xff0c;这里的证书主要用于webskt的连接启动edgehub&#xff0c;开启三个协程&#xff0c;分别把云发过来的消息路由到边缘…

蝴蝶书--ChatGPT基础科普

temperature的参数调整输出的概率分布&#xff0c;这个参数值越大&#xff0c;分布就看起来越平滑&#xff0c;也就是高概率和低概率的差距拉小了&#xff08;对输出不那么确定&#xff09; Top-P在累计概率超过P的词里进行选择&#xff0c;对于概率分布比较均匀的情况&#x…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

ADB 命令大全

Case1&#xff1a;报错Remote couldnt create file&#xff1a;Read-only file system 输入 adb disable-verity adb reboot adb root adb remount Case2&#xff1a;/system/bin/sh: cant create C:xxx.txt: Read-only file system Android设备的文件系统是基于Linux的&…

物联网硬件设计开发全攻略:十大关键阶段深度解析

为物联网应用设计开发高效稳定的硬件系统本身是一项既复杂又精细的艰巨任务。看似小巧的物联网设备一般由软件、固件和硬件组件组成&#xff0c;其中&#xff0c;硬件组件更是占据了约80%的成本与开发挑战。那么&#xff0c;为何硬件部分如此棘手&#xff1f;在这篇文章中&…

x汽车登陆网站登陆rsa加密逆向

声明&#xff1a; 本文章内容仅供学习交流&#xff0c;不用于其他其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c; 各位看官好哇&#xff0c;今天给大家带来一篇web自动化逆向的文章&#xff0c;如下图当前我…

C++ 几句话彻底点通虚表

#include <iostream>using namespace std;class Base { public:virtual void show() // 声明虚函数{cout << "Base" << endl;} };class Derived : public Base { public:void show() override // 覆盖虚函数{cout << "Derived" &l…

芯科科技大大简化面向无电池物联网的能量采集产品的开发

芯科科技推出其迄今最高能量效率且支持能量采集功能的无线SoC 中国&#xff0c;北京 – 2024年4月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;…

Day1: 5道C++ 面向对象高频题整理

1、什么是类&#xff1f; 在C中&#xff0c;类是一种用户定义的数据类型&#xff0c;它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态&#xff0c;而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图&#xff0c;根据这个蓝图可以创建对象&am…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间&#xff0c;本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法&#xff0c;经试验后简化了一下&#xff0c;得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面&#xff0c;不要…

Property ‘auth‘ does not exist on type ‘AGCApi‘.

Property ‘auth’ does not exist on type ‘AGCApi’. 解决 清理项目重新运行模拟器就可以了

程序员开发必备,开发资源资料分享【4】

第4部分内容 130-100051801-专栏课-罗剑锋-罗剑锋的 C实战笔记&#xff08;完结&#xff09;提取码&#xff1a; 131-100051901-专栏课-陈亦峰-互联网人的英语私教课&#xff08;完结&#xff09;提取码&#xff1a; 132-100051101-视频课-程超-分布式缓存高手课&#xff08…

CentOS-7安装clickhouse并允许其他主机登录

一、通用设置 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服务器之间时间同步 yum install -y ntpdate &…

Java | Leetcode Java题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution {public int trap(int[] height) {int n height.length;if (n 0) {return 0;}int[] leftMax new int[n];leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] Math.max(leftMax[i - 1], height[i]);}int[] …

用了Keras来构建一个卷积神经网络对MNIST数据集进行分类

首先导入所需库和模块&#xff0c;然后加载MNIST手写数字数据集并对数据进行预处理。接着定义了一个基于卷积神经网络&#xff08;CNN&#xff09;的模型&#xff0c;该模型包含多个卷积层、最大池化层以及Dropout层作为正则化手段。模型最后接一个全连接层作为输出层&#xff…

云南旅游攻略

丽江景点 Day1 ——丽江古城 丽江古城是一个充满文化和历史的地方&#xff0c;拥有丰富的景点和活动。 推荐游玩&#xff1a; 参观标志性建筑&#xff1a;大水车是丽江古城的标志性建筑&#xff0c;可以在这里拍照留念。 探索中心广场&#xff1a;四方街是古城的中心&#xf…