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

设计模式-命令模式

写在前面

Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正!

一、什么是命令模式?

命令模式是行为模式中的一种,通过将请求封装成对象,使开发者可以用不同的请求、队列或日志来参数化其他对象。
类比订外卖的过程:用户(触发者)在APP下单(命令),餐厅收到订单后(接收者)开始制作。平台不需要关心具体由谁做饭,只负责传递订单。

二、命令模式解释

命令模式的核心架构:

  1. 命令(Command)
    声明执行操作的统一接口,将请求封装为独立对象,使调用者与实现者解耦。

  2. 接收者(Receiver)
    封装具体业务能力,仅关注领域逻辑实现,不感知调用流程。

  3. 具体命令(ConcreteCommand)
    持有 Receiver 引用,在 Command 接口方法中通过委托执行 Receiver 的业务方法,可存储请求上下文参数。

  4. 触发者(Invoker)
    维护命令执行入口(触发命令方法),支持命令的存储和调度(如实现命令队列或历史记录),仅依赖 Command 接口。

  5. 客户端(Client)
    创建 Receiver 实例,构造 ConcreteCommand 并绑定 Receiver,配置 Invoker 与命令的关联关系。

三、案例实践

以居家控制系统为例,实现对灯光、空调的远程控制。先展示不使用命令模式的实现,再分析其不足。

基础类(接收者)

// 电灯类
public class Light {public void on() { System.out.println("开灯"); }public void off() { System.out.println("关灯"); }
}// 空调类
public class AirConditioner {public void on() { System.out.println("空调开启"); }public void off() { System.out.println("空调关闭"); }
}

硬编码实现

public class HomeController {private Light light;private AirConditioner ac;public HomeController() {light = new Light();ac = new AirConditioner();}// 每新增一个设备,就需要修改 switch-casepublic void executeCommand(String command) {switch (command) {case "LIGHT_ON": light.on(); break;case "AC_ON": ac.on(); break;default: System.out.println("未知命令");}}
}

问题分析:新增设备(如窗帘)时,必须修改 HomeControllerswitch-case 结构。随着功能增加,代码将难以维护,且难以实现组合操作。

命令模式实现

1. 抽象命令类
public interface Command {void execute();  // 执行命令(例如开灯)void undo();     // 撤销命令(例如关灯)
}
2. 具体命令
// 电灯命令
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) { this.light = light; }@Overridepublic void execute() { light.on(); }@Overridepublic void undo() { light.off(); }
}// 空调命令
public class ACOnCommand implements Command {private AirConditioner ac;public ACOnCommand(AirConditioner ac) { this.ac = ac; }@Overridepublic void execute() { ac.on(); }@Overridepublic void undo() { ac.off(); }
}
3. 控制器(触发者)
public class SmartHomeController {// 命令存储private Map<String, Command> commands = new HashMap<>();// 操作历史记录private Stack<Command> history = new Stack<>();// 绑定命令:例如将"开灯"按钮绑定到 LightOnCommandpublic void setCommand(String buttonName, Command command) {commands.put(buttonName, command);}// 执行命令public void executeCommand(String buttonName) {Command cmd = commands.get(buttonName);if (cmd != null) {cmd.execute();history.push(cmd); // 记录历史操作}}// 撤销上一步public void undoLastCommand() {if (!history.isEmpty()) {Command lastCmd = history.pop();lastCmd.undo();}}
}
4. 测试类(客户端)
@Test
public void test() {Light light = new Light();AirConditioner ac = new AirConditioner();SmartHomeController controller = new SmartHomeController();// 绑定命令controller.setCommand("开灯", new LightOnCommand(light));controller.setCommand("开空调", new ACOnCommand(ac));// 执行操作controller.executeCommand("开灯");    // 输出:开灯controller.executeCommand("开空调");  // 输出:空调开启controller.undoLastCommand();        // 输出:空调关闭
}

四、如何新增设备?以窗帘为例

1. 新增窗帘类(接收者)
public class Curtain {public void open() { System.out.println("打开窗帘"); }public void close() { System.out.println("关闭窗帘"); }
}
2. 新增窗帘命令
public class CurtainCommand implements Command {private Curtain curtain;public CurtainCommand(Curtain curtain) { this.curtain = curtain; }@Overridepublic void execute() { curtain.close(); } // 执行:关闭窗帘@Overridepublic void undo() { curtain.open(); }     // 撤销:打开窗帘
}
3. 使用新功能(无需修改控制器)
// 绑定新命令
Curtain curtain = new Curtain();
controller.setCommand("关窗帘", new CurtainCommand(curtain));
controller.executeCommand("关窗帘");  // 输出:关闭窗帘

改进效果:新增设备时,只需添加对应的 Command 类,无需修改控制器代码,且更容易实现组合命令。

五、长话短说

核心思想

将操作抽象为独立对象,通过参数化方式传递请求,解耦调用者与实现者。

适用场景

  • 需要解耦请求发送者与执行者

  • 需支持撤销/重做操作

  • 需实现事务操作(组合命令)

  • 需记录操作历史

  • 需支持任务队列或线程池调度

代码实现步骤

  1. 定义 Command 接口,声明执行方法。

  2. 创建具体命令类实现接口,并注入 Receiver 对象。

  3. 创建 Invoker 类管理命令对象。

  4. 客户端初始化顺序
    a. 创建 Receiver
    b. 创建 Command 并关联 Receiver
    c. 创建 Invoker 并绑定 Command

  5. 通过 Invoker 执行命令。

典型应用

  • 智能家居控制系统

  • 文本编辑器的撤销/重做

  • 事务型数据库操作

  • 任务调度系统

  • GUI 事件处理

相关文章:

设计模式-命令模式

写在前面 Hello&#xff0c;我是易元&#xff0c;这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误&#xff0c;欢迎大家留言指正&#xff01; 一、什么是命令模式&#xff1f; 命令模式是行为模式中的一种&#xff0c;通过将请求封装成对象&#xff0c;使开发者可…...

深入理解主从数据库架构与主从复制

目录 前言1. 主从数据库概述1.1 什么是主从数据库&#xff1f;1.2 主从数据库的应用场景 2. 主从数据库的工作原理2.1 主从数据库的读写分离2.2 数据同步机制2.3 异步与同步复制模式 3. 主从复制的实现步骤3.1 配置主库3.2 配置从库 4. 主从数据库架构的优缺点4.1 优点4.2 缺点…...

【C】初阶数据结构15 -- 计数排序与稳定性分析

本文主要讲解七大排序算法之外的另一种排序算法 -- 计数排序 目录 1 计数排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 4&#xff09; 计…...

@PostConstruct @PreDestroy

PostConstruct 是 Java EE&#xff08;现 Jakarta EE&#xff09;中的一个注解&#xff0c;用于标记一个方法在对象初始化完成后立即执行。它在 Spring 框架、Java Web 应用等场景中广泛使用&#xff0c;主要用于资源初始化、依赖注入完成后的配置等操作。 1. 基本作用 执行时…...

2025数维杯数学建模A题完整限量论文:空中芭蕾——蹦床运动的力学行为分析

2025数维杯数学建模A题完整限量论文&#xff1a;空中芭蕾——蹦床运动的力学行为分析 &#xff0c;先到先得 A题完整论文https://www.jdmm.cc/file/2712067/ 蹦床&#xff08; Trampoline &#xff09;是一项运动员利用蹦床的反弹&#xff0c;在空中展示技能 技巧的竞技运动&…...

Kubernetes Gateway API 部署详解:从入门到实战

引言 在 Kubernetes 中管理网络流量一直是一个复杂而关键的任务。传统的 Ingress API 虽然广泛使用,但其功能有限且扩展性不足。Kubernetes Gateway API 作为新一代标准,提供了更强大的路由控制能力,支持多协议、跨命名空间路由和细粒度的流量管理。本文将带你从零开始部署…...

移动设备常用电子屏幕类型对比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依赖背光&#xff0c;性能差异主要来自液晶排列和驱动方式。OLED 以自发光为核心优势&#xff0c;但成本与寿命限制其普及。E-Paper 专为低功耗静态显示设计&#xff0c;与传统屏幕技术差异显著。 参数LCD&#…...

HarmonyOS开发-组件市场

1. HarmonyOS开发-组件市场 HarmonyOS NEXT开源组件市场是一个独立的插件&#xff0c;需通过DevEco Studio进行安装&#xff0c;可以点击下载&#xff0c;无需解压&#xff0c;直接通过zip进行安装&#xff0c;具体安装和使用方法可参考HarmonyOsNEXT组件市场使用说明。Harmony…...

效果图云渲染:价格、优势与使用技巧

对于做3D设计来说&#xff0c;渲染效果图会占用设计电脑的资源&#xff0c;如果能免去这个环节就好了。用设计电脑渲不仅拖慢电脑速度&#xff0c;遇到紧急情况无法快速渲染出来还可能耽误进度。而云渲染的出现&#xff0c;正是针对这个点——渲的快&#xff0c;价格便宜&#…...

OptiStruct实例:声振耦合超单元应用

如图10-11所示&#xff0c;本例采用一个简化的整车模型&#xff0c;模型分为车身&#xff08;含声腔&#xff09;与底盘两部分。首先分别运用CMS与CDS方法对车身&#xff08;含声腔&#xff09;模型进行缩聚&#xff0c;生成.h3d格式的CMS超单元和cps超单元&#xff0c;然后进行…...

排序算法-插入排序

插入排序是一种简单直观的排序算法&#xff0c;其核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置&#xff0c;类似于整理扑克牌。 插入排序步骤 初始化&#xff1a;将序列的第一个元素视为已排序部分&#xff0c;其余为未排序部分。 选择元素&#xff1a;从未排…...

Uniapp Android/IOS 获取手机通讯录

介绍 最近忙着开发支付宝小程序和app&#xff0c;下面给大家介绍一下 app 获取通讯录的全部过程吧&#xff0c;也是这也是我app开发中的一项需求吧。 效果图如下 勾选配置文件 使用uniapp开发的童鞋都知道有一个配置文件 manifest.json 简单的说一下&#xff0c;就是安卓/ios/…...

【RAG】index环节中 关于嵌入模型和 ColBERT

1. 什么是嵌入模型&#xff1f;是不是把数据源转换为向量表示的模型&#xff1f; 是的&#xff0c;嵌入模型&#xff08;Embedding Model&#xff09;的核心功能就是将各种类型的数据&#xff08;例如&#xff0c;文本、图像、音频等&#xff09;转换成低维、稠密的向量表示。…...

一文掌握 LVGL 9 的源码目录结构

文章目录 &#x1f4c2; 一文掌握 LVGL 9 的源码目录结构&#x1f9ed; 顶层目录概览&#x1f4c1; 1. src/ — LVGL 的核心源码&#xff08;&#x1f525;重点&#xff09;&#x1f4c1; 2. examples/ — API 示例&#x1f4c1; 3. demos/ — 综合演示项目&#x1f4c1; 4. do…...

ROS1 和 ROS2 在同一个系统中使用

一、环境变量设置 echo "ros noetic(1) or ros2 foxy(2)?" read edition if [ "$edition" -eq "1" ]; thensource /opt/ros/noetic/setup.bash elsesource /opt/ros/foxy/setup.bash fi 二、针对不同的ROS版本创建不同的工作空间work space...

Redis 8.0携新功能,重新开源

01 引言 Redis从7.4版本起&#xff0c;将开源许可证改成 RSALv2&#xff08;Redis 源代码可用许可证&#xff09;与 SSPLv1&#xff08;服务器端公共许可证&#xff09;的双重授权策略。简单来说&#xff0c;就是不能随意商用。为了抵制Redis&#xff0c;Redis的替代品Valkey、…...

AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”

一、问题描述 AD原理图复制较多元器件时报错&#xff1a;AD原理图复制较多元器件时报错&#xff1a;“InvalidParameter Exception Occurred In Copy”。如下图 二、问题分析 破解BUG。 三、解决方案 1、打开参数配置 2、打开原理图优先项中的通用配置&#xff0c;取消勾选G…...

【wpf】12 在WPF中实现HTTP通信:封装HttpClient的最佳实践

一、背景介绍 在现代桌面应用开发中&#xff0c;网络通信是不可或缺的能力。WPF作为.NET平台下的桌面开发框架&#xff0c;可通过HttpClient轻松实现与后端API的交互。本文将以一个实际的HttpsMessages工具类为例&#xff0c;讲解如何在WPF中安全高效地封装HTTP通信模块。 二、…...

从概念表达到安全验证:智能驾驶功能迎来系统性规范

随着辅助驾驶事故频发&#xff0c;监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求&#xff0c;行业开始重估技术边界与验证能力&#xff0c;数字样机正成为企业合规落地的重要抓手。 2025年以来&#xff0c;围绕智能驾驶功能的争议不断升级。多起因辅…...

金贝灯光儿童摄影3大布光方案,解锁专业级童趣写真

随着亲子消费的持续升温&#xff0c;儿童摄影行业对高效、专业、灵活的专业灯光需求日益迫切。为精准解决儿童拍摄中孩子好动难配合、氛围单调、出片效率低下等痛点&#xff0c;深耕影像光源行业三十年&#xff0c;拥有丰富的商业人像摄影灯光解决方案的金贝品牌&#xff0c;近…...

双端口ram与真双端口ram的区别

端口独立性 真双端口RAM&#xff1a;拥有两个完全独立的读写端口&#xff08;Port A和Port B&#xff09;&#xff0c;每个端口都有自己的地址总线、数据总线、时钟、使能信号和写使能信号。这意味着两个端口可以同时进行读写操作&#xff0c;且互不干扰。 伪双端口RAM&…...

Java设计模式之单例模式:从入门到精通

一、单例模式概述 1.1 什么是单例模式 定义:单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。 专业解释:单例模式通过限制类的实例化过程,保证在整个应用程序生命周期中,某个类最多只有一个实例存在,…...

sqli-labs靶场18-22关(http头)

目录 less18&#xff08;user-agent&#xff09; less19&#xff08;referer&#xff09; less20&#xff08;cookie&#xff09; less21&#xff08;cookie&#xff09; less22&#xff08;cookie&#xff09; less18&#xff08;user-agent&#xff09; 这里尝试了多次…...

【图像大模型】Stable Diffusion Web UI:深度解析与实战指南

Stable Diffusion Web UI&#xff1a;深度解析与实战指南 一、项目概述核心功能 二、项目运行方式与执行步骤1. 环境准备2. 安装步骤在Windows上安装在Linux上安装 3. 使用Web UI 三、执行报错及问题解决方法1. Python版本不兼容2. CUDA未正确安装3. 依赖库安装失败4. 内存不足…...

Linux 学习笔记1

Linux 学习笔记1 一、用户和用户组管理用户组操作用户操作 二、文件权限管理权限查看权限修改归属权修改 三、系统快捷操作四、软件管理包管理工具服务管理 五、文件系统操作软链接 六、时间管理七、网络管理基础命令端口与进程进程管理 八、环境变量基础操作 九、其他重要概念…...

单例模式的两种设计

单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 1. 饿汉模式 (Eager Initialization) 饿汉模式在程序启动时就创建实例&#xff0c;线程安全。 cpp class EagerSingleton { public:// 删除拷贝构造函数和赋值运算符EagerSingleton(const EagerSingleton…...

【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?

在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面&#xff0c;有学员提到了这样一个问题&#xff1a; 鸿蒙的主推开发语言不是ArkTS吗&#xff0c;本课程为什么使用的是仓颉编程语言&#xff1f; 这里就这位同学的问题&#xff0c;统一做下回复&#xff0c;以方便…...

20250509 相对论中的\*\*“无空间”并非真实意义上的虚无,而是时空结构尚未形成\*\*的状态。 仔细解释下这个

相对论中的**“无空间”并非真实意义上的虚无&#xff0c;而是时空结构尚未形成**的状态。 仔细解释下这个 相对论中的“无空间”这一概念&#xff0c;严格来说并非绝对的虚无&#xff0c;而是指在物理学上时空结构尚未形成或无法定义的状态。这种状态通常出现在宇宙起源和黑洞…...

T-SQL在SQL Server中判断表、字段、索引、视图、触发器、Synonym等是否存在

SQL Server创建或者删除表、字段、索引、视图、触发器前判断是否存在。 目录 1. SQL Server创建表之前判断表是否存在 2. SQL Server新增字段之前判断是否存在 3. SQL Server删除字段之前判断是否存在 4. SQL Server新增索引之前判断是否存在 5. SQL Server判断视图是否存…...

C——数组和函数实践:扫雷

此篇博客介绍用C语言写一个扫雷小游戏&#xff0c;所需要用到的知识有&#xff1a;函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的&#xff0c;如何玩扫雷游戏&#xff1f; 如图&#xff0c;是一个标准的扫雷游戏初始阶段。由此…...

Java中的分布式缓存与Memcached集成实战

一、概述 分布式缓存是提升系统性能和扩展性的关键技术之一。Memcached作为一种高性能的分布式内存对象缓存系统&#xff0c;在许多场景下被广泛使用。本文将深入探讨如何在Java项目中集成Memcached&#xff0c;实现高效的分布式缓存。 二、Memcached简介 Memcached是一种高…...

OpenCV播放摄像头视频

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 播放摄像头视频和播放视频文件类似&#xff0c;也是通过类VideoCapture来实现&#xff0c;只不过调用open的时候传入的是摄像头的索引号。如果计算机安装了一个摄像头&#xff0c;则open的第一个参数通常是0&…...

[计算机科学#13]:算法

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a; 算法是解决问题的系统化步骤&#xff0c;不同的问题…...

git相关

1.将 dev 变基到 origin/master git rebase 是一个本地操作&#xff0c;它只会修改你当前所在分支的提交历史&#xff0c;而不会直接影响远程仓库或任何其他分支。 保持提交历史的线性和整洁&#xff1a; 这是 git rebase 最主要的目的。 想象一下 dev 分支是从 master 分支分…...

Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?

Web端访问缓慢问题诊断指南(测试工程师专项版) ——从浏览器渲染到网络层的全链路排查方案 一、问题定位黄金法则(前端性能四象限) 1. [网络层] 数据返回快 ≠ 资源加载快(检查Content Download时间) 2. [渲染层] DOM复杂度与浏览器重绘(查看FPS指标) 3. [执行层…...

计算机系统结构-第九章-互联网络 第十章

目录 恒等函数&#xff1a;I&#xff08;没变&#xff09; 交换函数&#xff1a;某一位取反 如下 角标为0&#xff0c;第0位取反 均匀洗牌函数、混洗函数Shuffle &#xff1a;σ 左移一位 &#xff08;左移右边补0&#xff0c;右移左边补0&#xff09; 蝶式互连函数but…...

H5 移动端适配最佳实践落地指南。

文章目录 前言一、为什么需要移动端适配&#xff1f;二、核心适配方案1. 视口&#xff08;Viewport&#xff09;设置2. 三种适配方案 &#xff08;仅供参考&#xff09;&#xff08;1&#xff09;rem 适配方案&#xff08;2&#xff09;vw/vh 适配方案&#xff08;3&#xff09…...

从电动化到智能化,法雷奥“猛攻”中国汽车市场

当前&#xff0c;全球汽车产业正在经历前所未有的变革&#xff0c;外资Tier1巨头开始向中国智能电动汽车市场发起新一轮“猛攻”。 在4月23日-5月2日上海国际车展期间&#xff0c;博世、采埃孚、大陆集团、法雷奥等全球百强零部件厂商纷纷发布战略新品与转型计划。在这其中&am…...

智能网联汽车 “中央计算” 博弈:RTOS 与跨域融合的算力分配挑战

一、引言 随着智能驾驶技术的飞速发展&#xff0c;汽车逐渐从传统的交通工具演变为移动的智能终端。智能网联汽车的核心竞争力日益体现在其强大的计算能力和高效的算力管理上。汽车电子电气架构&#xff08;EEA&#xff09;正经历从分布式架构向 “中央计算 区域控制” 架构的…...

springboot 加载 tomcat 源码追踪

加载 TomcatServletWebServerFactory 从 SpringApplication.run(&#xff09;方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月9日第72弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

企业高性能WEB服务器—Nginx

Nginx介绍 Nginx是一款轻量级的网页服务器、反向代理服务器以及电子邮件代理服务器。 具有高并发&#xff08;特别是静态资源&#xff09;、占用系统资源少的特性。它不仅是Web服务软件&#xff0c;还具有反向代理负载均衡功能和缓存服务功能 具备如下基本特性 可针对静态资…...

neo4j图数据库基本概念和向量使用

一.节点 1.新建节点 create (n:GroupProduct {name:都邦高保额团意险,description: "保险产品名称"} ) return n CREATE&#xff1a;Neo4j 的关键字&#xff0c;用于创建新节点或关系。 (n:GroupProduct)&#xff1a; n 是节点的临时别名&#xff08;变量名&#…...

安全核查基线-3.用户umask设置策略

在Linux中&#xff0c;umask&#xff08;用户文件创建掩码&#xff09;是一个重要的权限管理机制&#xff0c;用于控制新创建的文件和目录的默认权限。umask的值决定了文件或目录的初始权限中哪些权限位会被屏蔽&#xff08;即不可用&#xff09;。 1. umask 的作用 文件默认权…...

UE像素流是什么

UE像素流是什么 UE像素流送是一种云渲染技术&#xff0c;由虚幻引擎&#xff08;UE&#xff09;提出&#xff0c;用于在浏览器中运行高画质3D应用或游戏。其原理是在远程计算机&#xff08;可以是云端服务器或本地高性能服务器&#xff09;上运行UE开发的应用程序&#xff0c;…...

【C】初阶数据结构14 -- 归并排序

本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 2 迭代版本的归并…...

02_线性模型(回归线性模型)

描述 线性模型是在实践中广泛使用的一类模型&#xff0c;线性模型利用输入特征的线性函数&#xff08;linear function&#xff09;进行预测。 用于回归的线性模型 对于回归问题&#xff0c;线性模型预测的一般公式如下&#xff1a; $ \widehat y w[0]*x[0]w[1]*x[1]…w[p…...

当当网Top500书籍信息爬取与分析

爬取当当网的Top500书籍信息&#xff0c;并对书籍的评价数量进行排序&#xff0c;然后绘制前十名的条形图&#xff0c;然后对各个出版社出版的书籍数量进行排序&#xff0c;绘制百分比的饼图 # 导入所需的模块 import re # 正则表达式模块&#xff0c;用于提取文本中的特定模…...

Spring生态全景解析:Spring、Spring MVC、SpringBoot与Spring Cloud的关系

Spring生态全景解析&#xff1a;Spring、Spring MVC、SpringBoot与Spring Cloud的关系 1. Spring框架简介 Spring框架是一个轻量级的Java开发框架&#xff0c;由Rod Johnson于2003年创建。它主要解决了企业级Java开发中的复杂性&#xff0c;通过依赖注入(DI)和面向切面编程(A…...

STM32-TIM定时中断(6)

目录 一、TIM介绍 1、TIM简介 2、定时器类型 3、基本定时器 4、通用定时器 5、定时中断基本结构 6、时基单元的时序 &#xff08;1&#xff09;预分频器时序 &#xff08;2&#xff09;计数器时序 7、RCC时钟树 二、定时器输出比较功能&#xff08;PWM&#xff09; …...