当前位置: 首页 > news >正文

23种设计模式-行为型模式-访问者

文章目录

  • 简介
  • 场景
  • 解决
    • 完整代码
    • 核心实现
  • 总结

简介

访问者是一种行为设计模式,它能把算法跟他所作用的对象隔离开来。

场景

假如你的团队开发了一款能够使用图像里地理信息的应用程序。图像中的每个节点既能代表复杂实体(例如一座城市),也能代表更精细的对象(例如工业区和旅游景点等)。每个节点的类型都由它所属的类来表示,每个特定的节点就是一个对象。

将图像导出为  XML。
现在,你需要把图像导出到 XML 文件里。你打算为每个节点类添加导出函数,然后递归执行图像中每个节点的导出函数,有点类似我们之前的组合模式。另外,还可以使用多态让导出方法的调用代码不和具体的节点类相耦合。
但其他同事并不想修改已有的节点类。他们认为这些代码已经是产品了,修改的话可能会引入缺陷。
所有节点的类里都必须添加导出至 XML 文件的方法,但如果在修改代码的过程中引入了任何缺陷,那么整个程序都会面临风险。
另外,他们觉得在节点类里包含导出 XML 文件的代码好像没有意义。这些类的主要工作是处理地理数据。加入导出 XML 文件的代码明显不合适。
还有,这个功能完成之后,很有可能还需要提供导出其他类型文件的功能,或者其他奇怪的功能。这样你很可能要再次修改这些脆弱的类。

解决

访问者模式建议把新功能(行为)放在一个叫做访问者的独立类里,而不是整合到已有类里。需要执行操作的原始对象将作为参数传给访问者的方法,让方法能访问对象所包含的一切必要数据。
对于不同类的对象(比如示例里不同的节点),该怎么操作? 在我们的示例里,不同节点类导出 XML 文件的实际实现很可能不同。因此,访问者类可以定义一组方法,每个方法可接收特定类型的参数,如下所示:

class ExportVisitor implements Visitor {method doForCity(City c) { ... }method doForIndustry(Industry f) { ... }method doForSightSeeing(SightSeeing ss) { ... }

但我们究竟应该怎么调用这些方法(尤其是在处理整个图像方面)呢?这些方法的签名各不相同,我们就不能用多态机制。为了可以挑选出能够处理特定对象的访问者方法,我们需要先对它的类进行检查。是不是很麻烦?

foreach (Node node in graph)if (node instanceof City)exportVisitor.doForCity((City) node)if (node instanceof Industry)exportVisitor.doForIndustry((Industry) node)
}

为什么不用方法重载?即用相同的方法名称,不同的参数。 我们无法提前知道节点对象所属的类,所以重载机制没办法执行正确的方法。因为方法会把节点基类作为输入参数的默认类型。
访问者模式可以解决这个问题。它使用了一种叫做双分派的技巧,不使用麻烦的条件语句也可以执行正确的方法。其实,与其让客户端来选择调用特定的方法,不如把选择权委派给 作为参数传递给访问者的对象。因为这个对象知道它自己的类,能更自然地在访问者中选出正确的方法。它们会“接收”一个访问者并且告诉它应该执行的访问者方法。

// Client code
foreach (Node node in graph)node.accept(exportVisitor)
// City
class City ismethod accept(Visitor v) isv.doForCity(this)// ...
// Industry
class Industry ismethod accept(Visitor v) isv.doForIndustry(this)// ...

我们还是修改了节点类,但改动很小,而且我们能在后续添加行为时 不需要再次修改节点类的代码。
现在,如果我们抽取出所有访问者的通用接口,所有已有的节点都能跟任何访问者交互了。如果需要引入跟节点相关的某个行为,你只需要实现一个新的访问者类就行了。

完整代码

// Visitor 接口定义地理信息操作规范
interface GeoVisitor {void visitCity(CityElement city);     // 城市节点访问接口 void visitIndustry(IndustryElement industry); // 工业区访问接口void visitSightseeing(SightseeingElement sight); // 景区访问接口
}// 具象访问者(统计信息导出)
class StatisticsExporter implements GeoVisitor {@Overridepublic void visitCity(CityElement city) {  // 处理城市数据System.out.printf("统计城市[%s]: 人口%d万 | ",city.getName(), city.getPopulation());  // 访问节点属性System.out.println("GDP " + city.getGDP() + "亿元");}@Override public void visitIndustry(IndustryElement industry) {  // 处理工业区System.out.printf("工业区评估: %s 类型 | 占地面积%.1f平方公里\n",industry.getIndustryType(), industry.getArea());}@Overridepublic void visitSightseeing(SightseeingElement sight) {  // 处理景点System.out.printf("景点分级: %s(%dA景区)\n",sight.getLandmark(), sight.getRating());}
}// 地理元素抽象接口(使用双分派机制)
interface GeoElement {void accept(GeoVisitor visitor);  // 关键接收方法 
}// 城市实体类
class CityElement implements GeoElement {private String name;private int population;private double gdp;public CityElement(String name, int pop, double gdp) { ... } @Overridepublic void accept(GeoVisitor visitor) {  // 双分派入口 visitor.visitCity(this);}// Getters省略
}// 工业园区实体类 
class IndustryElement implements GeoElement {private String industryType;private double area;public IndustryElement(String type, double area) { ... }@Overridepublic void accept(GeoVisitor visitor) {visitor.visitIndustry(this);  // 调用工业区专门方法}
}// 旅游景区实体类
class SightseeingElement implements GeoElement {private String landmark;private int rating;public SightseeingElement(String name, int stars) { ... }@Override public void accept(GeoVisitor visitor) {visitor.visitSightseeing(this); // 调用景区处理逻辑}
}// 客户端使用
public class GeoClient {public static void main(String[] args) {// 构建地理数据模型(复杂对象结构)List<GeoElement> geoGraph = Arrays.asList(new CityElement("上海", 2487, 43214),new IndustryElement("化工", 58.3),new SightseeingElement("外滩", 5));// 应用统计访问者GeoVisitor exporter = new StatisticsExporter();geoGraph.forEach(element -> element.accept(exporter));  // 统一访问入口 }
}

核心实现

  1. 双分派机制:通过element.accept()调用visitor特定方法
  2. 开放扩展:新增数据操作只需添加访问者类
  3. 数据结构稳定:元素类无需修改即可支持新业务逻辑

总结

在这里插入图片描述

  1. 访问者(Vis­i­tor)接口:声明了一系列以Concrete Element为参数的访问者方法。如果编程语言支持重载,这些方法的名称可以是相同的,但是他们的参数一定是不同的。
  2. 具体访问者(Con­crete Vis­i­tor)会为不同的Concrete Element实现相同行为的几个不同版本。
  3. 元素(Ele­ment)接口声明了一个方法来“接收”访问者。这个方法必须有一个参数被声明为访问者接口类型。
  4. 具体元素(Con­crete Ele­ment)必须实现接收方法。这个方法的目的是根据当前元素类把调用重定向到相应访问者的方法里。请注意,即使元素基类实现了这个方法,所有子类都必须对它进行重写并调用访问者对象中的合适方法。
  5. 客户端(Client)通常会作为集合或其他复杂对象(例如一个组合树)的代表。客户端通常不知道所有的具体元素类,因为它们会通过抽象接口与集合中的对象进行交互。

相关文章:

23种设计模式-行为型模式-访问者

文章目录 简介场景解决完整代码核心实现 总结 简介 访问者是一种行为设计模式&#xff0c;它能把算法跟他所作用的对象隔离开来。 场景 假如你的团队开发了一款能够使用图像里地理信息的应用程序。图像中的每个节点既能代表复杂实体&#xff08;例如一座城市&#xff09;&am…...

springMVC-拦截器详解

拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别&#xff1a;拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&#xff0c;任何ja…...

centos练习docker<基础>

这半喇月发生了很多事&#xff0c;很无谓很闹心&#xff0c;今天重拾起自己&#xff0c;做做功课写写字 文章目录 一、准备二、实践2.1 安装docker2.2docker镜像操作2.2.1 下载镜像等基本操作2.2.2 启动容器等基本操作2.2.3 修改页面2.2.4 保存镜像2.2.5 分享社区 总结 一、准…...

GPT-5、o3和o4-mini即将到来

原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…...

EchoMimic 音频驱动照片生成视频部署测试

环境&#xff1a;Windows 11 NVIDIA RTX 3070 Laptop 16GB 我配置了阿里云的镜像&#xff0c;要实现一样的效果&#xff0c;你也可以在每一行的命令后加 -i https://mirrors.aliyun.com/pypi/simple/ 如&#xff1a; pip install package_name -i https://mirrors.aliyun.…...

React 和 JSX 中,这些符号 (=>, <, ? :)的用法

在 React 和 JSX 中&#xff0c;这些符号 (>, <, ? :) 都是 JavaScript 的语法特性&#xff0c;但它们在 JSX 中有特殊的用法和规则。下面我会详细解释每个符号的用途、语法规则以及在 React/JSX 中的具体应用。 1. 箭头函数 > (Arrow Function) 基本语法&#xff1…...

mindie1.0新特性及调试问题总结

说明 最近在ascend 310P3上使用mindie 1.0部署模型&#xff0c;跟我以前使用的mindie 1.0_rc2比&#xff0c;有很多新的特性和变化&#xff0c;导致部署出现了不少问题。这里罗列下我的发现&#xff0c;希望对其他人有用。 特性1&#xff1a;需要显式配置share_memory 报错信…...

【Axure原型案例】悦购APP产品原型设计

一、项目背景 在时尚潮流蓬勃发展的当下&#xff0c;潮流服装市场潜力巨大。悦购APP作为一款专注于潮流服装的商城APP&#xff0c;旨在为用户提供丰富多样的潮流服装选择&#xff0c;打造便捷、时尚的购物体验。本次使用Axure进行产品原型设计&#xff0c;旨在将产品理念和功能…...

React 列表渲染

你可能经常需要通过 JavaScript 的数组方法 来操作数组中的数据&#xff0c;从而将一个数据集渲染成多个相似的组件。在这篇文章中&#xff0c;你将学会如何在 React 中使用 filter() 筛选需要渲染的组件和使用 map() 把数组转换成组件数组。 1.如何通过 JavaScript 的 map() 方…...

《深度解析LightGBM与MySQL数据集成:高效机器学习的新范式》

在机器学习工程实践中&#xff0c;数据与模型的高效交互一直是制约算法性能发挥的关键瓶颈。LightGBM作为梯度提升决策树框架的杰出代表&#xff0c;其与关系型数据库MySQL的深度集成能力&#xff0c;为数据科学家提供了从原始数据到预测结果的完整解决方案。这种集成不是简单的…...

使用 node.js 和 MongoDB 编写一个简单的增删改接口 demo

文章目录 前言一、环境准备二、项目结构三、环境变量四、连接数据库3.1. connect.js 文件 五、定义数据模型5.1. BannerModel.js 文件 六、实现 server 接口6.1. server.js 文件 七、服务文件7.1. app.js 文件 八、感谢 前言 Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据…...

React-06React中refs属性(字符串refs,回调形式,React.createRef() )

1.React中refs属性 绑定到render输出的任何组件上&#xff0c;通过this.ref.绑定名直接操作DOM元素或获取子组件的实例。 2.绑定refs实例 2.1 字符串refs(已经过时参考官网API) 字符串(string)的ref存在一定的效率问题 <input refinput1 type"text" placehole…...

如何在 Windows 系统上安装 n8n:两种方法详解

如何在 Windows 系统上安装 n8n&#xff1a;两种方法详解 摘要 本文详细介绍了在 Windows 系统上安装 n8n 的两种方法&#xff1a;直接安装和 Docker 部署。直接安装适合初学者&#xff0c;通过 Node.js 和 npm 快速完成&#xff1b;Docker 部署适合需要更高灵活性和可移植性…...

LETTERS(信息学奥赛一本通-1212)

【题目描述】 给出一个rowcol的大写字母矩阵&#xff0c;一开始的位置为左上角&#xff0c;你可以向上下左右四个方向移动&#xff0c;并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行&#xff0c;输入字母矩阵行数R和列数S&#xff0c;1≤R,S≤20。 接…...

【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

下面是一份详细的说明文档&#xff0c;介绍该脚本的功能、用法及各部分的含义&#xff0c;供您参考和使用&#xff1a; Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供创建、删除、导出 kubeconfig、加…...

【kind管理脚本-1】便捷使用 kind 创建、删除、管理集群脚本

目录结构 . ├── cluster-demo-setting │ ├── 3node-demo.yaml │ └── ingress-cluster-demo.yaml └── kind-tool.sh简单使用 # 进入防止 kind-tool.sh 的目录 $ cd kt-dir/ # 用 alias 给个别名&#xff0c;更便于使用 $ alias kt"./kind-tool.sh"…...

Python-Django+vue仓库管理系统功能说明

❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目…...

蓝桥备赛指南(14):树的直径与重心

树的直径 什么是树的直径&#xff1f;树的直径是树上最长的一条链&#xff0c;当然这条链并不唯一&#xff0c;所以一棵树可能有多条直径。直径由两个顶点u、v来决定&#xff0c;若由一条直径&#xff08;u,v)&#xff0c;则满足一下性质&#xff1a; 1&#xff09;u、v的度数…...

Java RPC 框架是什么

Java RPC 框架是什么 Java RPC 框架 是用于在分布式系统中实现远程过程调用&#xff08;Remote Procedure Call&#xff0c;RPC&#xff09;的工具集。RPC 是一种通信协议&#xff0c;它允许程序调用位于远程服务器上的函数或方法&#xff0c;就像调用本地函数一样透明。RPC 框…...

MySQL 查询重写怎样把复杂查询变简单,让查询提高一个“速”!

目录 一MySQL 查询重写基础概念 什么是查询重写 为什么需要查询重写 二MySQL 查询重写的工作原理 查询解析阶段 重写规则应用阶段 生成执行计划阶段 查询重写流程图 三MySQL 查询重写的实现方式 使用 MySQL 内置的查询优化器 自定义查询重写插件 查询重写介绍图 四…...

HTML静态网页成品作业(HTML+CSS)——阜阳剪纸介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…...

Docker Swarm集群搭建与管理全攻略

文章目录 一、节点准备二、初始化 manager 节点三、管理 swarm 集群中的 worker 节点1、添加 worker 节点2、查看 worker 节点3、删除 worker 节点 四、管理 swarm 集群服务1、创建服务2、查看服务3、删除服务 五、管理 swarm 节点服务1、节点标签管理2、创建服务3、查看服务4、…...

kafka消费延迟

一、背景 PAAS1220 CRM系统 系统版本: BC Linux For Euler release 21.10 二、故障现象 grafana上kafka指标&#xff1a;指标消费延迟过高 容器内部kafka消费情况&#xff1a;没有消费者进行消费 查看webgate页面&#xff1a;应用性能--信息总览&#xff0c;查看到实例全…...

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记&#xff0c;主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…...

计算机视觉算法实战——实例分割算法深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 一、实例分割领域概述 实例分割(Instance Segmentation)是计算机视觉领域中的一个重要任务&#xff0c;它…...

ARM分拣机vs传统PLC:实测数据揭示的4倍效率差

在苏州某新能源汽车零部件仓库&#xff0c;凌晨3点的分拣线上依然灯火通明。8台搭载ARM Cortex-A72处理器的智能分拣机正在以每秒3件的速度处理着形状各异的电池包组件&#xff0c;它们通过MES系统接收订单信息&#xff0c;自主规划最优路径&#xff0c;将不同规格的零部件精准…...

IDEA 中遇到 Git Log 界面不显示问题的解决方案

IntelliJ IDEA 中遇到 Git Log 界面不显示问题的解决方案。以下是根据文章内容整理的解决步骤&#xff1a; (我清理 IDEA 缓存后成功解决&#xff09; 问题描述 在 IntelliJ IDEA 中&#xff0c;Git 的 Log 界面没有任何显示。其他选项和界面工作正常。使用命令行查询 Git 日…...

虚幻引擎UActorComponent的TickComponent详解

文章目录 前言一、TickComponent 的作用二、函数签名与参数三、 使用步骤1.启用 Tick2. 重写 TickComponent 四、实际示例&#xff1a;旋转组件4.1 头文件 URotatingComponent.h4.2 源文件 URotatingComponent.cpp4.3 使用组件 五、注意事项六、常见问题总结 前言 在虚幻引擎&…...

如何迁移 GitHub 仓库到 GitLab?

如何迁移 GitHub 仓库到 GitLab&#xff1f; 一、基础迁移方法&#xff08;保留完整历史&#xff09; 1.‌在 GitLab 创建空仓库 1.登录 GitLab 并新建项目&#xff0c;选择「空白项目」&#xff0c;‌不要初始化 README 或 LICENSE 文件 2.复制新建仓库的 HTTPS/SSH 地址&a…...

深入理解C++面向对象特性之一 多态

欢迎来到干货小仓库&#xff0c;堪比沙漠!!! 从“Hello World”到改变世界&#xff0c;中间隔着千万次再试一次. 1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的…...

linux下MMC_TEST的使用

一:打开如下配置,将相关文件编译到内核里: CONFIG_MMC_TEST CONFIG_MMC_DEBUG CONFIG_DEBUG_FS二:将mmc设备和mmc_test驱动进行绑定 2.1查看mmc设备编号 ls /sys/bus/mmc/drivers/mmcblk/mmc0:aaaa2.2将mmc设备与原先驱动进行解绑 echo mmc0:aaaa >...

数字人技术的核心:AI与动作捕捉的双引擎驱动(2/10)

摘要&#xff1a;数字人技术从静态建模迈向动态交互&#xff0c;AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈&#xff0c;但通过多模态融合技术、轻量化动捕方案等创新&#xff0c;数字人正逐步实现自然交互与情感表达。未来…...

Java Web从入门到精通:全面探索与实战(二)

Java Web从入门到精通&#xff1a;全面探索与实战&#xff08;一&#xff09;-CSDN博客 目录 四、Java Web 开发中的数据库操作&#xff1a;以 MySQL 为例 4.1 MySQL 数据库基础操作 4.2 JDBC 技术深度解析 4.3 数据库连接池的应用​ 五、Java Web 中的会话技术&#xff…...

从个人博客到电商中台:EdgeOne Pages的MCP Server弹性架构×DeepSeek多场景模板实测报告

什么是EdgeOne Pages&#xff1f; EdgeOne Pages 是腾讯云推出的一站式边缘开发与部署平台&#xff0c;基于全球边缘节点网络和 Serverless 架构&#xff0c;为开发者提供从代码托管到全球分发的全流程服务。其核心价值在于将边缘计算能力与现代 Web 开发范式深度融合&#xf…...

【C++】优先级队列+反向迭代器

priority_queue的介绍 通常用堆来实现&#xff0c;能在O(log n)的时间复杂度内插入和提取最高&#xff08;或最低&#xff09;优先级的元素。 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的(默认情况)。此…...

HOW - 缓存 React 自定义 hook 的所有返回值(包括函数)

目录 场景优化方案示例延伸例子&#xff1a;为什么这很重要&#xff1f;常见的请求 hook 封装优化前优化后优化点一览优化后的 useLoadData使用方式示例&#xff1a;优点回顾 场景 如果你写了一个自定义 Hook&#xff0c;比如 useMyHook()&#xff0c;它暴露出某些值或函数给外…...

AIDD-人工智能药物设计-网络药理学-多组学与网络药理学分析揭示龟龄集治疗少精症的机制

IF6.7|多组学与网络药理学分析揭示龟龄集治疗少精症的机制 2024年10月28日&#xff0c;海军军医大学张卫东教授团队在Phytomedicine&#xff08;IF6.7&#xff09;上发表了题为“Multi-omics and network pharmacology approaches reveal Gui-Ling-Ji alleviates oligoastheno…...

打破单一视角!融合红外和可见光,YOLO算法实现全天候无人机检测

目录 一、摘要 二、系统概述 三、数据集 视频记录 数据集标注 四、数据集分析 五、基于深度学习的无人机探测 基于规则的跟踪方法 六、结论 论文题目&#xff1a;Drone Detection and Tracking with YOLO and a Rule-based Method 论文链接&#xff1a;https://arxiv.…...

Go 语言数据类型

Go 语言数据类型 概述 Go 语言(也称为 Golang)是一种静态强类型、编译型、并发型、具有垃圾回收功能的编程语言。自2009年发布以来,Go 语言因其简洁的语法、高效的执行速度和强大的并发处理能力而广受欢迎。本文将详细介绍 Go 语言中的数据类型,帮助读者更好地理解和掌握…...

<tauri><rust><GUI>基于rust和tauri,将tauri程序打包为window系统可安装的安装包(exe、msi)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 发文平台 CSDN 环境配置 系统:windows 10平台:visual studio code语言:rust、javascript库:taur…...

ragflow开启https访问:ssl证书为pem文件,window如何添加证书

在 Windows 系统中安装 PEM 格式的证书(通常用于 SSL/TLS 或客户端认证)可以通过以下步骤完成: 方法 1:通过证书管理器(MMC)安装 打开证书管理器 按 Win + R,输入 mmc 回车。点击菜单栏的 文件 > 添加/删除管理单元。选择 证书 > 添加,然后选择 计算机账户 或 当…...

自己搭建cesium应用程序

Cesium项目开发基础(1)——Cesium环境搭建_cesium版本怎么看-CSDN博客 看这篇的时候&#xff1a; 所以要用IIS搭建网站。下载一些东西看这篇的这部分&#xff1a;Tomcat IIS 在局域网中搭建网站&#xff08;最全最详细教程&#xff09;_tomcat iis-CSDN博客 然后在IIS里怎么…...

本地项目HTTPS访问问题解决方案

本地项目无法通过 HTTPS 访问的原因通常是默认配置未启用 HTTPS 或缺少有效的 SSL 证书。以下是详细解释和解决方案&#xff1a; 原因分析 默认开发服务器仅支持 HTTP 大多数本地开发工具&#xff08;如 Vite、Webpack、React 等&#xff09;默认启动的是 HTTP 服务器&#xff…...

软考系统架构设计师之物联网与边缘计算笔记

一、物联网与边缘计算的核心概念 1. 物联网&#xff08;IoT&#xff09; 定义&#xff1a;通过传感器、设备等物理对象接入网络&#xff0c;实现数据采集、传输与智能控制&#xff0c;核心在于物联设备互联与数据驱动决策。架构分层&#xff1a; 感知层&#xff1a;传感器、R…...

已知Word内容格式固定,通过宏实现Word转Excel

文章目录 需求描述一、宏是什么&#xff1f;二、使用步骤1.启用开发工具2.VBA基础知识3.单个Word文件转为Excel4.批量将Word文件转为Excel文件 总结 需求描述 现在有多个Word文档&#xff0c;Word文档格式固定&#xff0c;假如Word内容分为单选题和多选题&#xff0c;每个题目…...

window上 docker使用ros2开发并usbip共享usb设备

曾经参考 https://blog.csdn.net/laoxue123456/article/details/138339029 来共享windows上的usb 发现没有办法成功总是出现 tcp 错误。telnet测试能够正常连接 很是奇怪&#xff0c;window上换成低版本的usbipd仍然是同样的错误&#xff0c;没有办法的情况下参考了docker官方文…...

3D激光轮廓仪知识整理

文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关应用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...

SSH远程工具

一、常见SSH远程工具 工具开源跨平台多标签文件传输高级功能价格Xshell❌Win✔️✔️脚本、会话管理免费/商业版Tabby✔️全平台✔️✔️插件扩展免费MobaXterm❌Win✔️✔️集成工具集免费/付费SecureCRT❌Win/macOS/Linux✔️✔️企业级加密$129+PuTTY✔️全平台❌❌基础连接…...

C++day8

思维导图 牛客练习 练习 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory> using namespace std; class user{ public: …...

Vue响应式系统的简单实现

一、什么是副作用函数和响应式数据&#xff1f; 副作用函数&#xff1a; 可以产生副作用的函数&#xff0c;那么什么是副作用呢&#xff1f;举个栗子&#xff1a; let count 1function effect() {count }function fn() {if (count 1) {console.log(执行1)} else {console.l…...