java 实现访问者模式
访问者模式是一种行为设计模式,它允许您在不修改对象结构的情况下,向对象结构中的元素添加新的操作。这通常用于解决对象结构中元素类型多变,但操作类型相对稳定的问题。在访问者模式中,我们有一个访问者接口和多个具体的元素类,每个元素类都可以接受访问者的访问。以下是在 Java 中实现访问者模式的一般步骤:
-
创建一个访问者接口(Visitor):该接口定义了对不同元素执行的访问操作。
-
创建多个具体元素类(ConcreteElement):这些类表示对象结构中的不同元素,并实现了接受访问者访问的方法。
-
创建一个对象结构类(ObjectStructure):这个类维护一个元素的集合,并允许访问者访问这些元素。
-
创建具体访问者类(ConcreteVisitor):这些类实现了访问者接口,并定义了对具体元素的访问操作。
现在,让我们通过一个示例来实现访问者模式。假设我们有一个图形(Shape)类层次结构,包括圆形(Circle)和矩形(Rectangle)等不同的形状,并且我们希望能够计算它们的面积和周长:
// 步骤 1: 创建访问者接口
interface ShapeVisitor {void visitCircle(Circle circle);void visitRectangle(Rectangle rectangle);
}// 步骤 2: 创建具体元素类
abstract class Shape {abstract void accept(ShapeVisitor visitor);
}class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}public double getRadius() {return radius;}@Overridevoid accept(ShapeVisitor visitor) {visitor.visitCircle(this);}
}class Rectangle extends Shape {private double width;private double height;public Rectangle(double width, double height) {this.width = width;this.height = height;}public double getWidth() {return width;}public double getHeight() {return height;}@Overridevoid accept(ShapeVisitor visitor) {visitor.visitRectangle(this);}
}// 步骤 3: 创建对象结构类
class Drawing {private List<Shape> shapes = new ArrayList<>();public void addShape(Shape shape) {shapes.add(shape);}public void accept(ShapeVisitor visitor) {for (Shape shape : shapes) {shape.accept(visitor);}}
}// 步骤 4: 创建具体访问者类
class AreaCalculator implements ShapeVisitor {private double totalArea = 0;@Overridepublic void visitCircle(Circle circle) {double area = Math.PI * circle.getRadius() * circle.getRadius();totalArea += area;}@Overridepublic void visitRectangle(Rectangle rectangle) {double area = rectangle.getWidth() * rectangle.getHeight();totalArea += area;}public double getTotalArea() {return totalArea;}
}class PerimeterCalculator implements ShapeVisitor {private double totalPerimeter = 0;@Overridepublic void visitCircle(Circle circle) {double perimeter = 2 * Math.PI * circle.getRadius();totalPerimeter += perimeter;}@Overridepublic void visitRectangle(Rectangle rectangle) {double perimeter = 2 * (rectangle.getWidth() + rectangle.getHeight());totalPerimeter += perimeter;}public double getTotalPerimeter() {return totalPerimeter;}
}// 示例
public class Main {public static void main(String[] args) {Drawing drawing = new Drawing();drawing.addShape(new Circle(5.0));drawing.addShape(new Rectangle(3.0, 4.0));AreaCalculator areaCalculator = new AreaCalculator();drawing.accept(areaCalculator);System.out.println("总面积:" + areaCalculator.getTotalArea());PerimeterCalculator perimeterCalculator = new PerimeterCalculator();drawing.accept(perimeterCalculator);System.out.println("总周长:" + perimeterCalculator.getTotalPerimeter());}
}
在这个示例中,我们定义了一个访问者接口 ShapeVisitor,然后创建了具体元素类 Circle 和 Rectangle,它们都实现了 accept 方法以接受访问者。对象结构类 Drawing 维护了一个形状列表,并允许访问者访问这些形状。我们还创建了两个具体访问者类 AreaCalculator 和 PerimeterCalculator,分别用于计算形状的面积和周长。
通过访问者模式,我们可以轻松地添加新的访问者来执行不同的操作,而无需修改现有的元素类。这使得代码更加灵活和可维护。
相关文章:
java 实现访问者模式
访问者模式是一种行为设计模式,它允许您在不修改对象结构的情况下,向对象结构中的元素添加新的操作。这通常用于解决对象结构中元素类型多变,但操作类型相对稳定的问题。在访问者模式中,我们有一个访问者接口和多个具体的元素类&a…...
JDK源码剖析之PriorityQueue优先级队列
写在前面 版本信息: JDK1.8 PriorityQueue介绍 在数据结构中,队列分为FIFO、LIFO 两种模型,分别为先进先出,后进后出、先进后出,后进先出(栈) 而一切数据结构都是基于数组或者是链表实现。 在…...
TSINGSEE青犀AI视频分析/边缘计算/AI算法·人脸识别功能——多场景高效运用
旭帆科技AI智能分析网关可提供海量算法供应,涵盖目标监测、分析、抓拍、动作分析、AI识别等,可应用于各行各业的视觉场景中。同时针对小众化场景可快速定制AI算法,主动适配大厂近百款芯片,打通云/边/端灵活部署,算法一…...
力扣(LeetCode)算法_C++——最大连续 1 的个数 III
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1,1,1,1,0], K 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字…...
23062C++QT day2
封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个公有成员函数:void…...
React三属性之:props
作用 将父组件的参数传递给子组件 父组件 import ./App.css; import React from react; import PropsTest from ./pages/propsTest class App extends React.Component{render(){return(<div><h2>App组件</h2><PropsTest obj{{name:王惊涛,age:27}}>…...
大数据安全 | (一)介绍
目录 📚大数据安全 🐇大数据安全内涵 🐇大数据安全威胁 🐇保障大数据安全 ⭐️采集环节安全技术 ⭐️存储环节安全技术 ⭐️挖掘环节安全技术 ⭐️发布环节安全技术 🐇大数据用于安全 📚隐私及其…...
软件工程的概念及其重要性
软件工程是指将工程原理和方法应用于软件开发过程的学科,涉及软件的设计、开发、测试、维护和管理等各个阶段。它旨在提高软件开发的效率和质量,并确保软件满足用户的需求和预期。 软件工程的重要性体现在以下几个方面: 提高开发效率&#x…...
[足式机器人]Part3 变分法Ch01-2 数学预备知识——【读书笔记】
本文仅供学习使用 本文参考: 《变分法基础-第三版》老大中 《变分学讲义》张恭庆 《Calculus of Variations of Optimal Control Theory》-变分法和最优控制论-Daneil Liberzon Ch01-2 数学基础-预备知识1 1.3.2 向量场的通量和散度1.3.3 高斯定理与格林公式 1.3.2 …...
【嵌入式开发 Linux 常用命令系列 7.1 -- awk 过滤列中含有特定字符的行】
文章目录 awk 过滤列中字符串 上篇文章:嵌入式开发 Linux 常用命令系列 7 – awk 常用方法详细介绍 awk 过滤列中字符串 cat test.log | awk -F $31 {print $0}说明: -F 以什么分隔列,这里是以空格为分隔符;$3代表第3列;$3…...
前端(十六)——Web应用的安全性研究
🙂博主:小猫娃来啦 🙂文章核心:Web应用的安全性研究 文章目录 概述常见前端安全漏洞XSS(跨站脚本攻击)CSRF(跨站请求伪造) 点击劫持安全性验证与授权用户身份验证授权与权限管理 安全…...
无涯教程-JavaScript - BIN2HEX函数
描述 BIN2HEX函数将二进制数转换为十六进制。 语法 BIN2HEX (number, [places])争论 Argument描述Required/Optionalnumber 您要转换的二进制数。 数字不能超过10个字符(10位)。数字的最高有效位是符号位。其余的9位是幅度位。 负数使用二进制补码表示。 Requiredplaces 要…...
Kafka环境搭建与相关启动命令
一、Kafka环境搭建 点击下载kafka_2.11-2.3.1.tgz文件链接 1、上传kafka_2.11-2.3.1.tgz,解压kafka_2.11-2.3.1.tgz,得到kafka_2.11-2.3.1文件夹 1)上传 #使用mobaxterm将 kafka_2.11-2.3.1.tgz 传入tools文件夹 #用下面代码进入tools文件…...
【C++】类的封装 ② ( 封装最基本的表层概念 | 类对象作为参数传递的几种情况 )
文章目录 一、类的封装 : 将数据和方法封装到一个类中1、封装最基本的表层概念2、代码分析 - 基本封装3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )4、完整代码示例 一、类的封装 : 将数据和方法封装到一个类中 1、封装最基本的表层概念 将数据和方法封…...
Linux上安装FTP
1、登录FTP,执行安装命令 yum -y install vsftpd 2、启动FTP服务器,设置开启自启动 systemctl enable vsftpd.service systemctl start vsftpd.service systemctl status vsftpd.service #查看状态, 显示active说明FTP启动成功 3、修改FTP配置文件/et…...
C/C++使用GDAL库编程窍门之——通用可移植性库(Common Portability Library, CPL)
C/C使用GDAL库编程窍门之——通用可移植性库(Common Portability Library, CPL) CPL简介 GDAL全称地理空间数据抽象库(Geospatial Data Abstraction Library),是一个强大的地理栅格空间数据转换库,支持众…...
Linux container_of() 宏定义
container_of 宏 今天遇到了一段这样的代码,大致意思是 通过该struct结构体变量的成员的地址来反推该struct结构体变量的地址 并且用到了内核的宏,container_of() static inline struct nova_inode_info *NOVA_I(struct inode *inode) {return container…...
详解python中的序列类型---列表list
概述 列表类型是包含0个或多个元素的有序序列,属于序列类型。列表可以进行元素的增加、删除、替换、查找等操作。列表没有长度限制,无素类型可以不同,不需要预定长度。 列表类型用中括号[]表示,也可以通过list(x)函数将集合或字…...
Unity 引擎中国版 “团结引擎” 发布
导读Unity 官方宣布,Unity 中国正式推出 Unity 中国版引擎 —— 团结引擎,同时也开启了 Unity 中国本土化进程的全新篇章。作为推动团结引擎落地的核心人物,Unity 中国 CEO 张俊波称致力于将其打造为一款更懂中国开发者的引擎。 团结引擎以 U…...
MindsDB为许多不支持内置机器学习的数据库带来了机器学习功能
选择平台的首要原则是“靠近数据”,让代码靠近数据是保持低延迟的必要条件。 机器学习,特别是深度学习往往会多次遍历所有数据(遍历一次被称为一个epoch)。对于非常大的数据集来说,理想的情况是在存储数据的地方建立模型,这样就不需要大量的数据传输。目前已经有部分数据…...
79.2万条中文医疗对话数据如何重塑AI医疗问答的未来?
79.2万条中文医疗对话数据如何重塑AI医疗问答的未来? 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data 在医疗AI快速发展的今…...
小型语言模型在乳业智能决策中的技术突破与应用
1. 小型语言模型在乳业智能决策中的技术突破在乳制品行业数字化转型浪潮中,我们面临着一个核心矛盾:大型语言模型(LLM)虽然能力强大,但高昂的云计算成本和数据隐私风险让大多数牧场望而却步。而小型语言模型࿰…...
DouYinBot 抖音无水印视频解析工具:3分钟快速搭建个人解析服务
DouYinBot 抖音无水印视频解析工具:3分钟快速搭建个人解析服务 【免费下载链接】DouYinBot 该项目仅自用,不提供抖音视频下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 在抖音内容创作日益普及的今天,如何快速获取无水…...
影刀RPA跨境店群运营架构:Python高并发协同与Chromium多账号环境隔离实战
影刀RPA跨境店群运营架构:Python高并发协同与Chromium多账号环境隔离实战 架构师观察:流水线下的底层较量 近日,科技圈的头条毫无意外地被某头部视频生成大模型(被誉为 Seedance 2.0 最强对手)偷跑的内测演示视频彻底…...
Windows 11硬件限制绕过终极指南:3种实用方法让老电脑轻松升级
Windows 11硬件限制绕过终极指南:3种实用方法让老电脑轻松升级 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
终极教程:如何用免费Chrome插件一键保存完整网页内容
终极教程:如何用免费Chrome插件一键保存完整网页内容 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extens…...
Anthropic为何如此反华
美国政客对中国进行科技封锁,本不是什么新闻。但一个商业公司宁可损失上亿美元的收入也要禁止中国人访问他们的AI就有点魔症了。我们不禁要问:为什么我们现在看到Anthropic的CEO Dario Amodei在所有场合都持强硬的反华立场,不免感觉有些奇怪。…...
Postman并发测试真相:不是高并发工具,而是缺陷暴露加速器
1. 为什么“并发测试”不是点几下就能出结果的幻觉?很多人第一次打开 Postman 的 Collection Runner,看到“Iterations”和“Delay”两个输入框,心里就默认:“填个100,点Run,不就模拟100个用户同时访问了吗…...
别再为DBSCAN调参发愁了!用Python的sklearn轻松上手OPTICS聚类(附实战代码)
用OPTICS算法告别DBSCAN调参噩梦:Python实战全解析当面对不规则形状或密度不均的数据集时,密度聚类算法往往能大显身手。DBSCAN作为其中最著名的代表,却让无数数据科学家又爱又恨——它的表现极度依赖两个关键参数ε和MinPts的选择࿰…...
别再乱用apt --fix-broken了!详解Ubuntu下unixodbc依赖报错的根本原因与安全修复流程
深入解析Ubuntu中unixodbc依赖冲突的根源与系统化修复方案当你在Ubuntu终端中看到"未满足的依赖关系"和"试图覆盖文件"的错误提示时,是否曾盲目执行过apt --fix-broken install命令?这种条件反射式的操作可能暂时解决问题࿰…...
