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

JAVA代理模式和适配器模式

文章目录

  • Java 代理模式和适配器模式
    • 代理模式(Proxy Pattern)
    • 适配器模式(Adapter Pattern)
    • 代理模式和适配器模式的区别
  • 代理模式的使用举例
    • 静态代理实现:用代理模式记录方法调用日志
    • 动态代理实现:使用 Java 动态代理记录方法调用日志
  • 适配器模式使用举例
    • 示例:适配老版本接口
    • 适配器模式扩展:对象适配 vs 类适配
  • 代理与适配器模式使用建议
    • 使用代理模式的时机
      • 使用适配器模式时机
      • 总结

Java 代理模式和适配器模式

代理模式(Proxy Pattern)

  • 代理模式是一种结构型设计模式,它为对象提供一个代理对象,以控制对目标对象的访问。代理模式可以在不改变目标对象的前提下,向目标对象添加额外的功能(如权限控制、日志记录、懒加载等)。

  • 特点
  1. 代理对象充当目标对象的替代品。
  2. 代理对象可以对目标对象的访问进行控制或增强。
  3. 常见场景:访问控制、性能优化(如懒加载)、日志记录、分布式调用(如 RPC)等。

适配器模式(Adapter Pattern)

  • 适配器模式也是一种结构型设计模式,它用于解决两个接口不兼容的问题。适配器模式通过引入一个适配器类,使得一个类的接口能够兼容另一个类的接口,最终实现它们可以协同工作。

  • 特点
  1. 适配器充当“中间翻译者”,解决接口不匹配的问题。
  2. 常见场景:兼容老系统(向后兼容)、集成第三方库,或者对接口的统一抽象。

代理模式和适配器模式的区别

对比点代理模式适配器模式
主要目标控制对目标对象的访问或增加功能解决两个接口不兼容的问题
角色代理对象、目标对象目标对象、适配器、需要适配的接口
使用场景访问控制、权限校验、日志记录、性能优化、分布式调用等将现有的类或接口适配为目标接口,解决接口不兼容的问题
实现方式通过代理类(静态代理或动态代理)实现对目标对象方法的增强通过适配器类实现接口的转换
是否增强功能代理模式可以对目标对象的功能进行增强适配器不增强功能,只是转换接口

代理模式的使用举例

Java 中代理模式可以分为两种实现方式:

  1. 静态代理:代理类由手动编写,在编译时确定。
  2. 动态代理:代理类在运行时动态生成,常用的是 Java 自带的动态代理(基于 java.lang.reflect.Proxy)和 CGLIB 动态代理。

静态代理实现:用代理模式记录方法调用日志

目标接口:

public interface Service {void doTask();
}public class RealService implements Service {@Overridepublic void doTask() {System.out.println("RealService: 执行任务");}
}

静态代理类:

public class LoggingProxy implements Service {private final Service realService;public LoggingProxy(Service realService) {this.realService = realService;}@Overridepublic void doTask() {System.out.println("LoggingProxy: 开始执行任务...");realService.doTask();System.out.println("LoggingProxy: 任务执行完成");}
}

测试代码:

public class StaticProxyExample {public static void main(String[] args) {Service realService = new RealService();Service proxy = new LoggingProxy(realService);proxy.doTask(); // 使用代理对象调用方法}
}

  • 输出
LoggingProxy: 开始执行任务...
RealService: 执行任务
LoggingProxy: 任务执行完成

动态代理实现:使用 Java 动态代理记录方法调用日志

  • 动态代理更加灵活,适合在运行时为任意接口生成代理。

目标接口和实现:

public interface Service {void doTask();
}public class RealService implements Service {@Overridepublic void doTask() {System.out.println("RealService: 执行任务");}
}

动态代理处理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class LoggingHandler implements InvocationHandler {private final Object target;public LoggingHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("LoggingHandler: 方法 " + method.getName() + " 开始执行");Object result = method.invoke(target, args);System.out.println("LoggingHandler: 方法 " + method.getName() + " 执行完成");return result;}
}

测试代码:

public class DynamicProxyExample {public static void main(String[] args) {Service realService = new RealService();// 创建动态代理Service proxy = (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new LoggingHandler(realService));proxy.doTask(); // 使用动态代理调用方法}
}

  • 输出
LoggingHandler: 方法 doTask 开始执行
RealService: 执行任务
LoggingHandler: 方法 doTask 执行完成

适配器模式使用举例

  • 适配器模式通常用于解决接口不兼容的问题,例如当我们需要将一个老接口适配为新的接口,或者需要集成第三方库时。

示例:适配老版本接口

  • 定义目标接口和老版本接口:
// 新接口
public interface NewInterface {void newMethod();
}// 老接口
public class OldClass {public void oldMethod() {System.out.println("OldClass: 调用旧方法");}
}
  • 适配器类:
public class Adapter implements NewInterface {private final OldClass oldClass;public Adapter(OldClass oldClass) {this.oldClass = oldClass;}@Overridepublic void newMethod() {// 在新方法中调用旧方法oldClass.oldMethod();}
}
  • 测试代码:
public class AdapterExample {public static void main(String[] args) {OldClass oldClass = new OldClass();NewInterface adapter = new Adapter(oldClass);adapter.newMethod(); // 调用新接口的方法,但实际调用的是旧接口的方法}
}

  • 输出
OldClass: 调用旧方法

适配器模式扩展:对象适配 vs 类适配

  • 对象适配器:通过组合(如上述示例中,适配器持有一个 OldClass 对象)。
  • 类适配器:通过继承来实现适配,适配器继承旧类并实现目标接口(要求旧类不能是 final,且适配器只能适配一个类)。

代理与适配器模式使用建议

使用代理模式的时机

  • 场景 1:需要为对象添加额外功能,而又不想直接修改目标对象的代码(如访问控制、日志记录等)。
  • 场景 2:需要延迟加载目标对象,或者在访问目标对象时添加缓存机制。

  • 推荐使用动态代理
    • 如果需要代理多个类或接口,动态代理更灵活且代码量更少。
    • 如果只针对一个类或接口,可以直接使用静态代理。

使用适配器模式时机

  • 场景 1:需要整合现有的旧系统或第三方库,而它们的接口与当前系统的接口不兼容。
  • 场景 2:需要对不同类的接口进行统一,提供一个一致的调用方法。

  • 建议:
    • 如果需要适配的类较多,可以考虑通过继承或组合方式实现适配器。
    • 如果适配的接口或类较复杂,可以结合工厂模式,统一管理适配器的实例化。

总结

模式适用场景优点缺点
代理模式功能增强(日志、权限、远程调用等)灵活添加功能,解耦目标对象和功能实现静态代理增加代码量,动态代理可能增加复杂度
适配器模式接口不兼容(老接口适配新接口、第三方库整合等)解决接口兼容问题,增强代码复用性若接口变化频繁,适配器可能需要频繁修改

相关文章:

JAVA代理模式和适配器模式

文章目录 Java 代理模式和适配器模式代理模式(Proxy Pattern)适配器模式(Adapter Pattern)代理模式和适配器模式的区别 代理模式的使用举例静态代理实现:用代理模式记录方法调用日志动态代理实现:使用 Java 动态代理记录方法调用日…...

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…...

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…...

一维、线性卡尔曼滤波的例程(MATLAB)

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能,用于估计在存在噪声的情况下目标状态的真实值 文章目录 一维线性卡尔曼滤波代码运行代码介绍1. **初始化部分**2. **数据生成**3. **卡尔曼滤波器实现**4. **结果可视化**5. **统计输出** 源代码 总结 一维线…...

【Rust自学】6.2. Option枚举

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.2.1. 什么是Option枚举 它定义于标准库中,在Prelude(预导入模块)中,负责描述这样的场景…...

unity学习1:第1个template的项目platformer 学习

目录 0 教训,不要学生思路:路径依赖 1 从unity的编辑器里直接下载一个template 2 第一个下马威:下载到本地的这个模板项目第一次运行就报错, 其次关了重进就好了 2.1 报错 2.2 解决 2.3 解决 3 第2个拦路虎: 项目的声音大小…...

初识 Conda:一站式包管理和环境管理工具

文章目录 1. 什么是 Conda?2. 为什么选择 Conda?3. Conda 的安装3.1 安装步骤(以 Miniconda 为例) 4. Conda 的核心功能4.1 包管理4.2 环境管理4.3 Conda Forge4.4 设置国内镜像 5. 常见使用场景5.1 数据科学项目5.2 离线安装5.3 …...

vue.js 组件化开发 根组件

Vue.js是一个用于构建用户界面的渐进式JavaScript框架。组件化开发是Vue.js的核心理念之一,它允许开发者将部分代码封装为可重用的组件,从而提高代码的复用性和可维护性。而根组件是Vue.js应用的最顶层组件,它包含了其他所有的组件。 下面详…...

ASP.NET WebForms:实现全局异常捕获与处理的最佳实践

在ASP.NET WebForms中,你可以通过以下方法来统一捕获后台异常: 1. 在Global.asax中使用Application_Error Global.asax文件允许你处理应用程序级别的异常。你可以在Application_Error事件中捕获所有未处理的异常,并根据需要记录或处理它们。…...

vue3配置测试环境、开发环境、生产环境

第一步:在src同级新建 .env.production 、.env.test 、.env.development文件 第二步:在文件中配置开发环境、生产环境、测试环境 // 开发环境 .env.developmentNODE_ENV developmentVUE_APP_MODE development outputDir dist_dev // 打出包的名称VUE_…...

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期&#xff0…...

linux Python环境部署

登录Python官网去下载对应的版本:Python下载地址 在data目录下创建python文件夹 mkdir python上传下载的安装包 Python-3.8.18.tgz解压 tar -xf Python-3.8.18.tgz进入解压后的目录 cd Python-3.8.18/编译安装 ./configure --prefix/data/python38 make &&…...

Python基础语法知识——数据类型的查询、数据类型转化

今天第一次学习python,之前学习过C,感觉学习起来还可以,就是刚用的时候有点手残,想的是python代码,结果写出来就是C,本人决定每天抽出时间写点。同时继续更新NX二次开发专栏学习,话不多说,晚上的…...

命令行之巅:Linux Shell编程的至高艺术(中)

文章一览 前言一、输入/输出及重定向命令1.1 输入/输出命令1.1.1 read命令1.1.2 echo命令 1.2 输入/输出重定向1.3 重定向深入讲解1.4 Here Document1.4.1 /dev/null 文件 二、shell特殊字符和命令语法2.1 引号2.1.1 双引号2.1.2 单引号2.1.3 倒引号 2.2 注释、管道线和后台命令…...

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…...

「matplotlib」绘制图线和数据点的样式风格和颜色表大全

绘制图线和数据点的样式风格和颜色表大全 显示图例 legend() 属性 linestyle 属性 marker 属性color 1、legend() 显示坐标轴中图线的对应标注的显示位置plt.legend(loc) locloc codebest (default)0upper right1upper left2lower left3lower rig…...

【基础还得练】 KKT 条件

优秀教程-真正理解拉格朗日乘子法和 KKT 条件: link优秀教程-最优化(6):一般约束优化问题的最优性理论: link KKT条件(Karush-Kuhn-Tucker条件)是非线性规划中的一组必要条件,在某些情况下也是最优解的充分…...

Node.JS 版本管理工具 Fnm 安装及配置(Windows)

安装流程可参考:fnm 安装及配置(Windows)_fnm安装-CSDN博客 然后就是在git bash如何生效 在 Git Bash 中使用 fnm 需要确保你正确设置了环境变量。你可以按照以下步骤进行配置: 1. **打开 Git Bash**: 启动 Git Bash。 2. **编辑 .bas…...

STM32-笔记11-手写带操作系统的延时函数

1、为什么带操作系统的延时函数,和笔记10上的延时函数不能使用同一种? 因为笔记10的延时函数在每次调用的时候,会一直开关定时器,而在FreeRTOS操作系统中,SysTick定时器当作时基使用。 时基是一个时间显示的基本单位。…...

CCNP_SEC_ASA 第六天作业

实验需求: 为保障内部用户能够访问Internet,请把10.1.1.0/24网络动态转换到外部地址池202.100.1.100-202.100.1.200,如果地址池耗尽后,PAT到Outside接口 提示:需要看到如下输出信息 Inside#telnet 202.100.1.1 Trying …...

Python小括号( )、中括号[ ]和大括号{}代表什么

python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ },分别用来代表不同的python基本内置数据类型。 小括号():struct结构体,但不能改值 python中的小括号( )&am…...

electron node-api addon开发

解决方案入口 拷贝日志以及json等第三方源码 增加包含目录 编写接口 默认模板已经有一个回调函数了 照葫芦画瓢就行 其中几个重要的点要注意 1.参数传入 比如如下的例子: 头文件定义: public:下增加 Napi::Value StartAnswer (const Napi::Callb…...

vue之axios基本使用

文章目录 1. axios 网络请求库2. axiosvue 1. axios 网络请求库 <body> <input type"button" value"get请求" class"get"> <input type"button" value"post请求" class"post"> <!-- 官网提供…...

uniapp中wx.getFuzzyLocation报错如何解决

一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下&#xff1a; uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; r…...

Peter Lax线性代数教材:Linear Algebra and Its Applications 2nd Ed

这本线性代数教材&#xff0c;印象很深刻&#xff0c;记得是高中时期自学线性代数的时候看过。这本书跟Gilbert Strang的教材MIT线性代数教材&#xff1a;Linear Algebra and Its Applications相比&#xff0c;内容没这么紧凑&#xff0c;而且表述也更加代数风格&#xff0c;很…...

vue3封装而成的APP ,在版本更新后,页面显示空白

一、问题展示 更新之后页面空白&#xff0c;打不开 &#xff0c;主要是由于缓存造成的 二、解决办法 1、随机数代码实现 使用随机数来动态的生成静态资源目录名可以避免浏览器缓存&#xff0c;但同时每次也会导致浏览器每次都下载最新的资源。如果静态资源过大&#xff0c;可…...

技术栈整理

java系列: javaSE, javaEE&#xff0c;jdk8&#xff0c;jdk17&#xff0c;jdk21 springframework(4, 5, 6) springboot(2, 3) mybatis mybatisplus hibernate springjpa&#xff0c;springjdbc springmvc, springwebflux&#xff0c;structs springsecurity dubbo zookeeper s…...

初始c语言第一个c语言项目

第一个c语言项目 //c语言中一定要有main函数 //主函数//printf是一个库函数 //专门用来打印数据//std 标准 //i-input //o-output // #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//c语言规定main函数是程序的入口 //标准的主函数的写法 int main() {printf(&qu…...

CSS实现无限滚动的列表

CSS本身不能实现无限滚动的列表&#xff0c;无限滚动通常需要结合HTML、CSS和JavaScript来完成。以下是一个简单的实现无限滚动的列表的示例&#xff0c;它使用了JavaScript来动态加载和展示内容。 <!DOCTYPE html> <html lang"en"> <head> <me…...

【ES6复习笔记】Spread 扩展运算符(8)

在现代前端开发中&#xff0c;JavaScript 的扩展运算符&#xff08;Spread Operator&#xff09;是一个非常有用的特性&#xff0c;它允许你将数组或对象展开&#xff0c;以便在函数调用、数组拼接、对象复制等场景中更方便地处理数据。扩展运算符&#xff08;spread&#xff0…...

【Rust自学】7.3. use关键字 Pt.1:use的使用与as关键字

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.3.1. use的作用 use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则&#xff0c;也就是只有公共的部分引入进来才…...

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…...

python爬虫----爬取视频实战

python爬虫-爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…...

shardingsphere分库分表项目实践5-自己用java写一个sql解析器+完整项目源码

前1节我们介绍了 shardingsphere 分表分库的sql解析与重写&#xff1a; shardingsphere分库分表项目实践4-sql解析&重写-CSDN博客 那么shardingsphere sql 解析底层究竟是怎么实现的呢&#xff0c;其实它直接用了著名的开源软件 antlr . antlr 介绍&#xff1a; ANTLR&a…...

【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.2.1. 路径的简介 在Rust里&#xff0c;如果想要找到模块里的某个东西&#xff0c;就必须知道并使用它的路径。Rust中的路径就跟文件系统…...

ubuntu虚拟机中搭建python开发环境

1.Anaconda安装 1&#xff09;Anaconda下载 清华大学开源软件镜像站下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 官网&#xff1a;https://www.anaconda.com/distribution/ 2&#xff09;运行 .sh 文件 bash Anaconda3-5.2.0-Linux-x86_…...

OpenHarmony-5.PM 子系统(2)

电池服务组件OpenHarmony-4.1-Release 1.电池服务组件 Battery Manager 提供了电池信息查询的接口&#xff0c;同时开发者也可以通过公共事件监听电池状态和充放电状态的变化。电池服务组件提供如下功能&#xff1a; 电池信息查询。充放电状态查询。关机充电。 电池服务组件架…...

三相电的相电压、线电压、额定值、有效值,变比,零序电压,零序电流,三相三线制的三角形连接,三相四线制的星形连接

在二次设备配置中经常有根电压系统相关的名词&#xff0c;本身不是学电气的&#xff0c;有些名词经常查了忘&#xff0c;后续工作所有遇到跟电气相关的知识总结在此帖&#xff0c;便于后续直接查看&#xff0c;避免每次都要重新查、重新梳理。 相电压和线电压的关系是根号3倍&a…...

基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案

前言 其实这个需求很简单&#xff0c;但是这个需求又是项目中必不可少的&#xff0c;尤其对于性能调优这块&#xff0c;但是使用哪种方式更加方便呢&#xff0c;这就是本篇博文需要讨论的重点 系统时间 可以通过 System.currentTimeMillis() 或 System.nanoTime() 来实现。 …...

C语言-数据结构-树

目录 一,树 1,基本术语: 2,树的性质: 3,树的遍历: 4,森林的遍历: 5,树和二叉树的转换: 6,二叉树和森林的转化: 7,树的存储: 1,双亲表示法 2、孩子链存储结构 3、孩子兄弟链存储结构 二,二叉树: 1,二叉树的性质: 2,二叉树的遍历: 3,二叉树的存储结构: 顺序存储:…...

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…...

【Linux】flock 文件级别的锁定

flock 是 Linux/Unix 系统中的一个命令&#xff0c;用于实现文件级别的锁定。它允许你在多个进程之间共享对文件的访问&#xff0c;但确保在同一时间只有一个进程可以访问文件&#xff0c;避免竞态条件&#xff08;race conditions&#xff09;和数据不一致问题。 flock 的基本…...

每天40分玩转Django:Django部署概述

一、Django部署概述 在开发阶段,我们通常使用Django内置的轻量级开发服务器runserver。但在生产环境中,为了应对大量并发请求,需要使用高性能的WSGI服务器,如Gunicorn、uWSGI等。同时还要配置Nginx等Web服务器作为反向代理,实现负载均衡、静态文件处理等。下面是Django部署的整…...

【unity c#】深入理解string,以及不同方式构造类与反射的性能测试(基于BenchmarkDotNet)

出这篇文章的主要一个原因就是ai回答的性能差异和实际测试完全不同&#xff0c;比如说是先获取构造函数再构造比Activator.CreateInstance(type)快&#xff0c;实际却相反 对测试结果的评价基于5.0&#xff0c;因为找不到unity6确切使用的net版本&#xff0c;根据c#9推测是net5…...

防抖和节流的方法详解和CSS文本溢出小知识

1.防抖 防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 场景:搜索框输入发请求,一些拖拽盒子,或者滚动事件 防抖的实现:利用间歇函数 const timer =setTimeout(callback函数,间隔时间) //执行完会返回自身的这个定时器的编号//事件所触发的函…...

深度解析:Maven 和 Gradle 的使用比较及常见仓库推荐

Maven 和 Gradle 是 Java 项目中最常用的构建工具。它们各有优势&#xff0c;适用于不同的场景。本文将对两者进行详细的对比&#xff0c;并推荐一些常用的 Maven 和 Gradle 仓库&#xff0c;帮助开发者高效管理依赖。 一、Maven 和 Gradle 的使用比较 1.1 基本介绍 Maven 基…...

CSS---实现盒元素div内input/textarea的focus状态时给父元素加属性!

注意兼容性&#xff0c;低版本浏览器无效 要实现当 textarea 文本框获得焦点时&#xff0c;自动给其父元素添加类名或样式&#xff0c;您可以使用 CSS 的 :focus-within 伪类选择器。这个选择器会在元素本身或其任何子元素获得焦点时应用样式。 示例代码 假设您有以下 HTML 结…...

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域&#xff0c;追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证&#xff0c;成为能够帮助企业降低安装成本&#xff0c;提高设备性能的创新解决方案。 【全球认证&#xff0c;品质保障】ATV320 系列秉持施耐德…...

Dynamo:Amazon 的高可用键值仓储

大家觉得有意义和帮助记得及时关注和点赞!!! Dynamo 是 Amazon 的高可用分布式键值存储&#xff08;key/value storage&#xff09;系统。这篇论文发表 的时候&#xff08;2007&#xff09;它还只是一个内部服务&#xff0c;现在&#xff08;改名为 DynamoDB&#xff09;已经发…...

前端开发 -- 自动回复机器人【附完整源码】

一&#xff1a;效果展示 本项目实现了一个简单的网页聊天界面&#xff0c;用户可以在输入框中输入消息&#xff0c;并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容&#xff0c;通过关键字匹配来生成自动回复。 二&#xff1a;源代码分享 <!DOCTYP…...