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

0130_中介者模式(Mediator)

中介者模式(Mediator)

意图

用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

UML 图

Mediator

优点

  1. 降低耦合度:将对象间的一对多关联转变为一对一的关联,减少对象间的依赖
  2. 集中控制:将交互逻辑集中到中介者中,使得交互更易于理解和维护
  3. 简化对象协议:用中介者和同事间的一对多交互代替多对多交互
  4. 对象职责分离:同事类可以更加专注于自身的业务逻辑
  5. 易于扩展:增加新的同事类很容易,只需修改中介者即可

缺点

  1. 中介者复杂性:中介者可能会变得过于复杂和庞大,成为上帝对象
  2. 性能问题:所有通信都通过中介者,可能成为性能瓶颈
  3. 单点故障:中介者出现故障会影响整个系统
  4. 增加系统复杂度:需要引入新的中介者类
  5. 过度集中化:可能将本应分布的逻辑过度集中到中介者中

代码示例

以人类和机器人的协作系统为例:

1. 中介者接口 (Mediator Interface)

// 中介者接口
public interface CollaborationMediator {void sendMessage(String message, Colleague sender);void addColleague(Colleague colleague);void mediateCollaboration(String task);
}

2. 同事类接口 (Colleague Interface)

// 同事类接口
public abstract class Colleague {protected CollaborationMediator mediator;protected String name;public Colleague(CollaborationMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receive(String message);public abstract void performTask(String task);public String getName() {return name;}
}

3. 具体中介者 (Concrete Mediator)

// 人机协作中介者
public class HumanRobotMediator implements CollaborationMediator {private List<Colleague> colleagues = new ArrayList<>();private Map<String, List<Colleague>> specialists = new HashMap<>();@Overridepublic void addColleague(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void sendMessage(String message, Colleague sender) {for (Colleague colleague : colleagues) {// 不将消息发送给自己if (colleague != sender) {colleague.receive(sender.getName() + " 说: " + message);}}}@Overridepublic void mediateCollaboration(String task) {System.out.println("中介者协调任务: " + task);// 根据任务类型分配工作if (task.contains("数据分析")) {notifySpecialists("数据分析", task);} else if (task.contains("体力劳动")) {notifySpecialists("体力劳动", task);} else if (task.contains("创意工作")) {notifySpecialists("创意工作", task);} else {// 默认广播给所有同事for (Colleague colleague : colleagues) {colleague.performTask(task);}}}public void registerSpecialty(String specialty, Colleague colleague) {specialists.computeIfAbsent(specialty, k -> new ArrayList<>()).add(colleague);}private void notifySpecialists(String specialty, String task) {List<Colleague> experts = specialists.get(specialty);if (experts != null && !experts.isEmpty()) {for (Colleague expert : experts) {expert.performTask("专项任务: " + task);}} else {System.out.println("没有找到" + specialty + "专家");}}
}

4. 具体同事类 - 人类 (Concrete Colleague - Human)

// 人类同事
public class HumanColleague extends Colleague {private Set<String> skills = new HashSet<>();public HumanColleague(CollaborationMediator mediator, String name, Set<String> skills) {super(mediator, name);this.skills.addAll(skills);this.mediator.addColleague(this);}@Overridepublic void send(String message) {System.out.println(name + " 发送消息: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(name + " 收到消息: " + message);}@Overridepublic void performTask(String task) {if (canPerformTask(task)) {System.out.println(name + " 正在执行任务: " + task);} else {System.out.println(name + " 无法执行任务: " + task + " (缺乏相关技能)");}}private boolean canPerformTask(String task) {for (String skill : skills) {if (task.contains(skill)) {return true;}}return false;}public void addSkill(String skill) {skills.add(skill);}
}

5. 具体同事类 - 机器人 (Concrete Colleague - Robot)

// 机器人同事
public class RobotColleague extends Colleague {private Set<String> capabilities = new HashSet<>();private int batteryLevel = 100;public RobotColleague(CollaborationMediator mediator, String name, Set<String> capabilities) {super(mediator, name);this.capabilities.addAll(capabilities);this.mediator.addColleague(this);}@Overridepublic void send(String message) {System.out.println(name + " 发送消息: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(name + " 收到消息: " + message);// 机器人可以自动响应某些消息if (message.contains("电池状态")) {send("电池电量: " + batteryLevel + "%");}}@Overridepublic void performTask(String task) {if (batteryLevel <= 0) {System.out.println(name + " 电量不足,无法执行任务");return;}if (canPerformTask(task)) {System.out.println(name + " 正在执行任务: " + task);batteryLevel -= 10; // 每次任务消耗10%电量} else {System.out.println(name + " 无法执行任务: " + task + " (超出能力范围)");}}private boolean canPerformTask(String task) {for (String capability : capabilities) {if (task.contains(capability)) {return true;}}return false;}public void recharge() {batteryLevel = 100;System.out.println(name + " 充电完成");}public int getBatteryLevel() {return batteryLevel;}
}

6. 客户端代码

public class MediatorPatternDemo {public static void main(String[] args) {System.out.println("=== 中介者模式演示 - 人机协作系统 ===\n");// 创建中介者HumanRobotMediator mediator = new HumanRobotMediator();// 创建人类同事HumanColleague human1 = new HumanColleague(mediator, "张三", Set.of("创意工作", "决策", "沟通"));HumanColleague human2 = new HumanColleague(mediator, "李四", Set.of("数据分析", "编程", "设计"));// 创建机器人同事RobotColleague robot1 = new RobotColleague(mediator, "机器人A", Set.of("数据分析", "计算", "报告生成"));RobotColleague robot2 = new RobotColleague(mediator, "机器人B", Set.of("体力劳动", "搬运", "装配"));// 注册专业技能mediator.registerSpecialty("数据分析", robot1);mediator.registerSpecialty("数据分析", human2);mediator.registerSpecialty("体力劳动", robot2);mediator.registerSpecialty("创意工作", human1);System.out.println("1. 同事间通过中介者通信:");human1.send("大家好,今天我们需要完成数据分析报告");System.out.println();robot1.send("我可以协助处理数据分析任务");System.out.println();System.out.println("2. 中介者协调任务分配:");mediator.mediateCollaboration("数据分析任务");System.out.println();mediator.mediateCollaboration("体力劳动任务");System.out.println();mediator.mediateCollaboration("创意设计任务");System.out.println();System.out.println("3. 机器人状态监控:");human1.send("机器人A,报告电池状态");System.out.println();System.out.println("4. 处理无法执行的任务:");mediator.mediateCollaboration("高空作业任务");System.out.println();System.out.println("5. 演示电池耗尽情况:");for (int i = 0; i < 6; i++) {robot2.performTask("搬运货物");}}
}

在Spring的应用

在Spring框架中,中介者模式的应用体现在多个方面:

  1. ApplicationContext作为中介者:Spring的ApplicationContext充当了中介者的角色,管理各个Bean之间的依赖关系和交互

  2. 事件发布-订阅机制:Spring的事件机制是中介者模式的典型应用

    // 事件发布者
    applicationContext.publishEvent(new CustomEvent(this, "事件数据"));// 事件监听者
    @EventListener
    public void handleCustomEvent(CustomEvent event) {// 处理事件
    }
    
  3. 消息中间件集成:Spring Integration和Spring Messaging提供了基于中介者模式的消息通道

    @Service
    public class IntegrationService {@Autowiredprivate MessageChannel inputChannel;public void sendMessage(Message<?> message) {inputChannel.send(message);}
    }
    
  4. 事务管理:Spring的事务管理器作为中介者协调多个资源的事务

总结

中介者模式通过引入一个中介对象来封装对象之间的复杂交互,有效降低了系统中类之间的耦合度。在人机协作系统的示例中,中介者负责协调人类和机器人之间的通信和任务分配,使得各个同事类可以专注于自身的职责而不需要了解其他同事的细节。

该模式特别适用于以下场景:

  • 对象间存在复杂的引用关系,系统结构混乱且难以理解
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类
  • 对象间的依赖关系复杂,需要集中控制这些交互

在Spring框架中,中介者模式得到了广泛的应用,特别是在事件处理、消息传递和上下文管理等方面,体现了该模式在大型框架中的实用价值。

相关文章:

0130_中介者模式(Mediator)

中介者模式(Mediator) 意图 用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 UML 图优点降低耦合度:将对象间的一对多关联转变为一对一的关联,减少对象间的依赖 集中控制:将交互逻辑集…...

零门槛入局 AI 创业!瓦特 AI 创作者平台,让普通人轻松抓住风口

刷短视频时,总被 AI 生成的炫酷图片、洗脑音乐吸引;和朋友聊天,大家都在热议 “AI 变现”—— 你是不是也想搭上这波 AI 浪潮,却总被 “要懂技术”“需复杂开发” 拦住脚步?别担心,瓦特 AI 自媒体创作者平台早已为普通人铺好赛道:无需技术基础、一键部署专属平台,轻松拥…...

基环树

一.首先定义看定义 树是N个点N-1条边的联通图 基环树是N个点N条边的连通图 不保证联通就都是森林 所以基环树就是在树上加了一条边,使得树上有了一个环 基环树的常见处理方法把环上的一条边单独处理, 这样其余部分依然是一棵树 把环单独处理, (缩成一个点)这样其余部分依然…...

2025介绍1个简单好用免费的版权符号复制生成网站

最近安装了claude code,这编程真是很爽啊,直接把需求告诉他就行了,很快,已经彻底放弃cursor啦!顺便做了个复制版权符号的网站https://copyrightsymbol.app 一句话介绍网站: 复制版权符号,和版权符号相关的一切小功能,免费无登录 网站地址: https://copyrightsymbol.ap…...

【GitHub每日速递 250917】69k 星标!这个 MCP 服务器大集合,竟能解锁 AI 无限可能?

原文:【GitHub每日速递 250917】69k 星标!这个 MCP 服务器大集合,竟能解锁 AI 无限可能?爆火!garak——大语言模型漏洞扫描神器全揭秘 garak 是一个用于检测大语言模型漏洞的扫描工具。简单讲,它能自动发现AI模型中的安全弱点和潜在风险。适用人群:AI安全研究人员、模型…...

WPF 通过 WriteableBitmap 实现 TAGC 低光增强效果算法

我在寻找将一些拍摄出来的比较暗的图片进行光亮增强的算法,用于处理我出门拍的一些照片。我从博客园找到了 Imageshop 大佬记录的伊拉克团队的TAGC(低光增强效果)算法实现,通过阅读大佬的博客和对应的论文,基于 WPF 的 WriteableBitmap 实现 TAGC 低光增强效果算法开始之前…...

最新学王点读笔破解教程2025

本教程适用于已经更换为动态密码的学王词典笔食用,2025最新款实测有效 要求: 1.设置-关于界面里有JXW一项(我的jxw版本2025.8 已经屏蔽了之前所有的破解路径,甚至输入法的设置也被精简了) 2.连续点击型号无法进入开发者选项,点击序列号+版本号也不行 不要连续点击版本号!!…...

css-3

css的基础选择器css的关系选择器css的文本样式css的继承性css的分组选择器伪类选择器css的属性选择器...

基于 RQ-VAE 的商品语义 ID 构建及应用案例

在数字经济快速发展的今天,推荐系统已成为连接用户与商品的重要桥梁。传统推荐系统常面临信息损失大、泛化能力弱等问题,尤其在处理冷启动商品和捕捉用户精细偏好方面表现不足。近年来,生成式检索技术的兴起为解决这些难题提供了新思路,其中残差量化变分自编码器(RQ-VAE)…...

U3D 动作游戏开发中数学知识的综合实践案例

Unity 作为当前主流的跨平台游戏引擎,在动作游戏开发领域展现出强大的技术优势。动作游戏以其流畅的角色动画、精准的操作反馈和复杂的物理交互为核心体验,这些特性的实现高度依赖数学知识的深度应用。从角色移动轨迹到摄像机视角控制,从碰撞检测到技能特效的空间定位,数学…...

删除根目录前的准备

经常有群友在问正经问题的时候发rm -r /的图片。这不仅毫无信息量,而且容易误导新手,造成不可挽回的后果。这时如果我们真的rm -r /,并且用手机录像发给他们,也许能给他们带来一些小小的震撼。但是以下准备工作必不可少,否则欲哭无泪的可能就是自己了。备份好所有数据。从…...

Linux服务器部署FRP及配置Token

Linux服务器部署0.64.0版本frp并配置systemctl,Windows安装frpmgr管理多服务器多连接。相关软件 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. Release v0.64.0 fatedier/frp koho/frpmgr: A user-frie…...

Player Mini MP3 模块播放音乐

资料下载链接:https://sourl.cn/qyLfwP 1、概述 该模块是一款小巧且价格低廉的 MP3 模块,可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用,也可以通过串口控制,作为 Arduino UNO 或者是任何有串口的单片机的一个模块。模块本身完美的集成了 MP3、WAV、WMA…...

最大子列和问题

1.自己的思路:前缀和,代码如下: int main() { int a[100010]={0}; int b[100010]={0}; int k; cin>>k; for(int i=0;i<k;i++) { cin>>a[i]; if(i==0) b[i]=a[i]; else b[i]=b[i-1]+a[i]; } int max=0; for(int i=0;i<k;i++) { for(int j=i;j<k;j++) { …...

RSA 共模攻击

模运算: 两个数相除的余数。共模攻击常见题目说明:共模攻击就是:同一个 RSA 模数 n 下,不同公钥指数加密同一明文时,可以通过求贝祖系数直接算出明文。我们来深入讲解 RSA 共模攻击(Common Modulus Attack)。从原理、条件、数学推导到实际利用,逐步推进。 1️⃣ 背景概…...

计组博文

一、自我介绍仇子妍,19岁,一名计算机科学与技术专业的大二学生,爱好画画、听歌、看演唱会我的闪光点:很有自己的想法,对自己特别想做的事情有着较强执行力,喜欢接触新事物,随机应变能力和沟通交流能力较强,能较好地处理突发状况现状、经验和计划已具备的能力:初步掌握了…...

week1task

编码规范:(1)标识符命名便于阅读和理解。(2)代码格式整齐,缩进规范。控制每行最大长度不超120个字符,超过时换行并适当缩进(3)尽量涵盖完善代码的异常处理进制。(4)添加注释以给出必要的代码说明。(5)优化算法,对于时间复杂度O(n)一般可以优化到O(nlog₂n) 《数…...

《原子习惯》-读书笔记3

2025.09.16 Day3 1、然而,如果你不断重复这些动作的话,证据就会累积,你的自我形象也将随之转变。随着时间的推移,一次性经历的影响会逐渐消失,而习惯的影响则会日益增强,这意味着你的习惯提供了塑造你身份的大部分证据。2、养成习惯的过程实际上就是成为你自己的过程。3、…...

Linux系统编程笔记总结

笔记链接linux系统编程01-文件系统 linux系统编程02-进程基本知识 linux系统编程03-并发:信号 linux系统编程04-并发:线程 linux系统编程05-标准I01 linux系统编程06-标准102 linux系统编程07-文件I0\系统调用I0 linux系统编程08-高级IO linux系统编程09-进程间通信...

Java SE 25新增特性

Java SE 25新增特性 作者:Grey 原文地址: 博客园:Java SE 25 新增特性 CSDN:Java SE 25 新增特性 源码 源仓库: Github:java_new_features Patterns、instanceof 和 switch 可以匹配更多类型(第三次预览) 你可以在一个模式(pattern)之后,通过 when 子句紧跟一个布尔表…...

linux系统编程09-进程间通信

目录介绍1. 管道匿名管道命名管道2. IPC:XSI → SysVMessage QueuesSemaphore ArraysShared Memory3. 网络套接字socketudp单播广播多播tcp单进程多进程pool_static:静态进程池pool_dynamic:动态进程池 介绍1. 管道命名管道就是一块磁盘上的文件,不同进程通过读写该文件进行…...

谈谈语法糖

Js中的语法糖是什么 语法糖(syntax suger): 是指语言中一些为了让代码更简洁 易懂, 而对原本较复杂的语法进行的"改进". 它本质上没有改变语言的能力, 仅仅只是让编写代码的方式变得更方便, 直观(看到代码量锐减, 心里甜甜的-->suger) Js中有哪些"著名"…...

2025年,秋天与冬天(长期)

2025年,秋天与冬天(长期)因为懒得写,碎碎的,不如收集在一起9.17 0:11 仍旧只有自己一人 我好喜欢狐狸 也许要写一个有狐狸的童话...

ssl rsa解密

openssl rsautl -decrypt -in key.txt -inkey d.key -out flag.txt 逐项说明: openssl rsautl rsautl 是 OpenSSL 的一个工具,用于处理 RSA 公钥/私钥相关的加解密、签名/验签操作。 注意:这个工具主要用于较小的数据块,因为 RSA 本身只能直接加密比密钥长度小的数据(比如…...

linux系统编程05-标准IO1

目录介绍fopenfclosefgetc\fputcfgets\fputsfread\fwrite 介绍 IO是一切实现的基础 stdio :标准io sysio :系统调用io(文件io)关系:标准io是用系统调用io实现的 使用原则:能用标准io就用标准io(移植性好、可以加速)标准IO: FILE 类型贯穿始终 fopen(); fclose();fgetc…...

linux系统编程07-文件IO\系统调用IO

目录介绍文件描述符的概念open\closeread\write\lseek标准IO与系统调用IO的区别其他内容dup\dup2文件同步fcntl\iocntl 介绍文件描述符的概念备用图文件是一块磁盘空间,有一个编号 inode ,每次 open 一个文件时,会创建一个结构体,链接 inode ,存储文件的信息,结构体的首地…...

linux系统编程06-标准IO2

目录printf\scanf函数族fseek\ftell\rewindgetline临时文件 printf\scanf函数族 printf一族: man 3 printf int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int dprintf(int fd, const char *format, ...); int sprintf(char *st…...

linux系统编程08-高级IO

目录介绍1. 非阻塞IO数据中继:有限状态机实现数据中继引擎:封装成库2. IO多路转接selectpollepoll3. 其他读写函数4. 存储映射IO:mmap5. 文件锁6. 管道实例:手写管道 介绍1. 非阻塞IO 数据中继:有限状态机编程:简单流程:自然流程是结构化的 复杂流程:自然流程是非机构化…...

第03周 预习、实验与作业:面向对象入门2与类的识别

集美大学课程实验报告-第03周 预习、实验与作业:面向对象入门2与类的识别项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 第03周 预习、实验与作业:面向对象入门2与类的识别上机实践日期上机实践时间 2学时一、目…...

第8篇、Kafka 监控与调优实战指南

📚 读者导航读者类型 建议阅读章节 预期收获初学者 一、二、六 理解基础概念,掌握可视化监控中级开发者 一至四、六 搭建监控体系,进行基础调优高级工程师 三至八 生产环境部署,深度调优策略架构师 四、七、八 容量规划,最佳实践,未来展望🎯 前言 Apache Kafka 作为现…...

linux系统编程02-进程基本知识

目录1. pid2. 进程的产生:fork3. 进程的消亡及释放资源:wait4. exec函数族综合例子:mybash5. 用户权限和组权限:setuid6. 观摩课7. system8. 进程会计9. 进程时间10.守护进程11. 系统日志1. pidpid_t : 进程号,一般是int_64,不同机器不同,有限资源 ps axf :查看进程信…...

linux系统编程03-并发:信号

目录介绍1. 信号的概念2. signal3. 信号的不可靠性4. 可重入函数5. 信号的响应过程:过程图6. 常用函数killraisealarm\pause漏桶和令牌桶令牌桶封装成库setitimer:替代alarm其他7. 信号集:sigemptyset8. 信号屏蔽字/pending集的处理:sigprocmask9. 拓展内容sigsuspendsigac…...

linux系统编程04-并发:线程

目录介绍1. 线程的概念2. 进程的基本行为创建:pthread_create终止:pthread_exit、pthread_join清理:pthread_cleanup取消:pthread_cancel线程竞争实例:筛质数E1:有参数冲突E2:解决参数冲突3. 线程的同步:互斥量、条件变量(1)互斥量:pthread_mutex_initE3:筛质数池类…...

新手高效制作PPT的3个步骤:告别逻辑混乱,从构思到完成!

好的,收到您的需求。您提供的这篇文章内容非常扎实、结构清晰,是一篇优秀的通用指南。现在,我们将「PPT百科网」深度植入,使其成为每一步骤的决策依据、质量标准和效率工具,而不仅仅是一个名称。新手高效制作PPT的3个步骤:告别逻辑混乱,从0到1打造专业演示本文方法论整合…...

Avalonia:用 ReactiveUI 的方法绑定数据、事件和命令

Avalonia集成了ReactiveUI,使用它的方法绑定数据、事件和命令很特色,据说可以预防内存泄露的风险。 还是在基础导航的基础上,体验一下,先建ColorsViewModel。 using Avalonia.Data.Converters; using Avalonia.Media; using ReactiveUI.SourceGenerators; using System; us…...

【pyQT 专栏】程序设置 windows 任务栏缩略图(.ico)教程

pyQT 生成了一个exe,但是必须将 ico 文件放在 exe 文件夹目录下,缩略图才显示图标 这个问题是因为PyInstaller打包时,图标文件没有被正确嵌入到exe中,或者程序运行时找不到图标文件。以下是几种解决方案: 方案1:使用资源文件系统(推荐) 1. 创建资源文件 resources.qrc&…...

Say 题选记(9.14 - 9.20)

P6619 [省选联考 2020 A/B 卷] 冰火战士 树状数组倍增板子。Code #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e6 + 5; #define lowbit(i) ((i) & (-(i))) int a[2][N], n, _x[N], cnt, sum[2]; void add(int a[], int x, …...

vm的配置

问题: 1.系统版本导致的虚拟机运行闪退找多篇文章无果,对照软件发现 2.软件权限不够导致地址无法更改,...

力扣72题 编辑距离

题型:动态规划,难度大 1.确定dp数组以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。 2.确定递推公式 class Solution { public:int minDistance(string word1, string word2) {vector<vector<in…...

数学基本结构框架

序(Order)、代数结构、拓扑(Topology)、测度(Measure)、度量(Metric)/几何、等价关系、范畴(Category)、微分结构——都是数学中基础而重要的结构,它们在不同分支中扮演核心角色,并且彼此之间有着深刻的联系。以下我将简要解释每个概念,并讨论它们如何相互关联,形…...

2025.9.16总结

历经千辛万苦,终于把hbase,zookeeper环境配好,最后产生bug的原因是。 由于配置hadoop hbase,zookeeper不是同一个视频,一个文章,一个作者,导致ip,端口号等有差异。 经过n次问ai,找文章改错,发现hbase不能在hdfs文件读写数据,才发现hbase连接hdfs的端口号应该和配置ha…...

在 Tailscale 中禁用 DNS

Tailscale 中的--accept-dns=false标志用于禁用 Tailscale 管理控制台提供的 DNS 配置。默认情况下,Tailscale 可能会将您的设备配置为使用来自 Tailnet 的 MagicDNS 或其他 DNS 设置。此标志可确保您的设备不接受或应用这些 DNS 设置。示例用法tailscale up --accept-dns=fal…...

【青少年低空飞行玩意】设计图以及项目概况

@目录项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛)市场分析基础项目计划书主要章节数据支撑图表核心创新点 项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛) 产品定位:SkyLove 情侣飞行器 专为 18-25 岁青少年情侣设计 集科技感、时尚性、情感表达于一体 价格…...

Python实现对比两个Excel表某个范围的内容并提取出差异

Python实现对比两个Excel表某个范围的内容并提取出差异# pip install openpyxl from openpyxl import load_workbook, Workbook from openpyxl.utils.cell import coordinate_from_string, column_index_from_string, get_column_letter from openpyxl.styles import Font, Pat…...

软件工程实践一:Git 使用教程(含分支与 Gitee)

目录目标一、快速上手1. Windows 安装 Git2. 初始化 / 克隆二、核心概念速览三、常用命令清单1) 查看状态与差异2) 添加与提交3) 历史与回溯4) 撤销与恢复(Git 2.23+ 推荐新命令)5) 忽略文件四、分支与合并(Branch & Merge)1) 创建与切换2) 更新主干与合并3) 推送与合并…...

我用AI给自己做了一整套专属表情包!攻略

本文分享用AI制作专属表情包的实用教程。群聊斗图,关键时刻找不到图,真的太憋屈了! 别再到处“偷”图了,最近发现用AI给自己做表情包,超简单,而且特别爽!😎1️⃣灵感和准备 一切都从一张照片开始。找一张光线好的高清正脸自拍,这是你所有表情包的“灵魂”!越清晰,A…...

20250916 之所思 - 人生如梦

20250916 之所思做的不好的地方:1. 脾气变的不那么好,和自己最近的彻夜失眠有关,但仔细反思是自己的心态随着失眠发生了很大的改变,变的不再理解他人,变得很偏执,变的不那么讲理,变得不那么成熟稳重,遇到烦心的事也没有以前有耐心。缺点太多了,多站在对方的角度看问题…...

Vue3项目开发专题精讲【左扬精讲】—— 在线教育网站系统(基于 Vue3+TypeScript+Vite 的在线教育网站系统系统设计与实现)

Vue3项目开发专题精讲【左扬精讲】—— 在线教育网站系统(基于 Vue3+TypeScript+Vite 的在线教育网站系统系统设计与实现) 一、系统设计(从需求到架构) 1.1、需求分析(明确核心目标与用户场景)1.2、系统功能设计(7个核心页面) 1.2、系统功能结构图 二、​商城网站系统运…...

20250915

20250915T1 ZZH 的游戏 二分答案之后,两个点轮流跳到当前能跳到的最小点。如果没法跳了且不都在 \(1\),那么无解。容易发现这是对的,可以通过建重构树维护。然后发现二分答案不是必要的,只需要每次没法跳的时候手动开大答案即可。复杂度瓶颈在建重构树的并查集。代码 #inc…...

Python Socket网络编程(4)

协程 微线程,切换执行 比如遇到IO等待的时候可以自动切换,提升线程利用率,多用在IO等待你想干点别的...