深度解析 Java 中介者模式:重构复杂交互场景的优雅方案
一、中介者模式的核心思想与设计哲学
在软件开发的历史长河中,对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时,系统会陷入 "牵一发而动全身" 的困境。中介者模式(Mediator Pattern)作为行为型设计模式的重要成员,其核心思想是通过引入一个中介者对象,将原本对象间直接多对多交互转化为对象与中介者之间的一对多交互,从而实现 "交互逻辑集中管理,对象职责单一化" 设计目标。
这种模式的诞生源于对现实世界的抽象:就像房地产中介集中管理房东与租客的沟通,机场塔台协调各航班的起降,中介者在软件系统中扮演着 "交互枢纽" 的角色。它通过定义一个中介者接口,让所有需要交互的对象(称为同事类)只与中介者通信,而不是直接相互引用。这种设计将原本散落的交互逻辑收拢到中介者中,使得系统结构从复杂的网状结构转变为清晰的星型结构。
从设计原则来看,中介者模式完美体现了 "迪米特法则"(最少知识原则),降低了对象间的耦合度;同时遵循 "单一职责原则",将对象的业务逻辑与交互逻辑分离。这使得系统在面对需求变化时,只需修改中介者的行为,而无需调整具体的同事类,大大提升了系统的可维护性和扩展性。
二、中介者模式的典型应用场景
(一)复杂交互场景的解耦
当系统中存在多个对象需要相互通信,且这些交互关系呈现网状结构时,中介者模式是理想的解决方案。例如在 GUI 开发中,多个界面组件(按钮、文本框、下拉菜单等)之间需要相互协作,传统的直接交互会导致组件间紧密耦合,而引入中介者后,每个组件只需与中介者通信,简化了交互逻辑。
(二)分布式系统中的协调
在分布式系统中,不同服务节点之间的交互需要统一的协调机制。中介者可以作为消息路由中心,管理各节点之间的通信,避免服务节点之间直接依赖。例如微服务架构中的 API 网关,本质上就承担了中介者的角色,协调各个微服务之间的调用。
(三)遗留系统的重构
当维护一个对象间交互复杂的遗留系统时,中介者模式可以逐步解耦原有对象的直接依赖。通过引入中介者,将原本散落的交互逻辑封装起来,使得后续的功能扩展和维护更加容易。
(四)游戏开发中的事件处理
在游戏引擎中,角色、道具、场景等对象之间存在复杂的交互逻辑。使用中介者模式可以将这些交互集中管理,例如当角色拾取道具时,中介者负责协调角色状态更新、道具消失、音效播放等多个事件,确保各对象的行为一致。
三、中介者模式的类结构与实现要点
(一)核心类结构
- Mediator(中介者接口):定义中介者与同事类之间的交互接口,通常包含用于同事类通信的方法,如
sendMessage()
。 - ConcreteMediator(具体中介者):实现中介者接口,维护对各个同事类的引用,协调同事类之间的交互,具体处理对象间的通信逻辑。
- Colleague(同事类接口):定义同事类与中介者交互的接口,通常包含设置中介者和发送消息的方法。
- ConcreteColleague(具体同事类):实现同事类接口,持有对中介者的引用,通过中介者与其他同事类通信,而不是直接交互。
(二)实现步骤详解
- 定义同事类接口
java
public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void send(String message);public abstract void receive(String message);
}
- 实现具体同事类
java
public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void send(String message) {mediator.send(message, this);}@Overridepublic void receive(String message) {System.out.println("同事A收到消息:" + message);}
}
- 定义中介者接口
java
public interface Mediator {void send(String message, Colleague colleague);
}
- 实现具体中介者
java
public class ConcreteMediator implements Mediator {private ConcreteColleagueA colleagueA;private ConcreteColleagueB colleagueB;public void setColleagueA(ConcreteColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ConcreteColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleagueA) {colleagueB.receive(message);} else {colleagueA.receive(message);}}
}
- 客户端使用
java
public class Client {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleagueA a = new ConcreteColleagueA(mediator);ConcreteColleagueB b = new ConcreteColleagueB(mediator);mediator.setColleagueA(a);mediator.setColleagueB(b);a.send("你好,同事B!");b.send("你好,同事A!");}
}
(三)关键实现细节
- 中介者与同事类的双向关联:同事类持有中介者的引用,通过中介者发送消息;中介者需要维护所有同事类的引用,以便协调它们之间的交互。
- 交互逻辑的集中化:所有对象间的交互逻辑都封装在中介者中,同事类只负责处理自身的业务逻辑,不涉及与其他同事类的直接交互。
- 可扩展性设计:当需要增加新的同事类时,只需修改中介者以支持新的交互,而无需改变现有的同事类,符合 "开闭原则"。
四、与相关设计模式的对比分析
(一)vs 观察者模式(Observer Pattern)
两者都涉及对象间的通信,但侧重点不同:
- 中介者模式:通过中介者对象集中管理交互,对象之间不直接通信,适合处理多对多的复杂交互。
- 观察者模式:基于发布 - 订阅机制,主题对象与观察者对象之间是一对多的依赖关系,适合实现事件驱动的通知机制。
(二)vs 外观模式(Facade Pattern)
两者都用于简化复杂系统的接口,但目的不同:
- 中介者模式:关注对象间的交互逻辑,将网状交互转化为星型结构,解耦对象之间的直接依赖。
- 外观模式:为复杂子系统提供统一的接口,简化客户端与子系统的交互,不改变子系统内部的交互方式。
(三)vs 责任链模式(Chain of Responsibility)
两者都涉及对象间的通信,但处理方式不同:
- 中介者模式:所有交互都通过中介者集中处理,对象之间没有链式传递。
- 责任链模式:请求沿着处理链传递,直到有一个对象处理它,适合处理可动态指定处理者的场景。
五、实战案例:基于中介者模式的 GUI 组件协作
(一)场景描述
设计一个简单的用户注册界面,包含用户名输入框、密码输入框、注册按钮和提示标签。要求当用户名或密码为空时,注册按钮不可用;输入合法时,按钮变为可用,并在点击时显示注册成功信息。
(二)传统实现的问题
如果直接让各个组件相互监听状态变化,会导致组件间紧密耦合:输入框需要知道按钮的状态,按钮需要监听输入框的变化,增加新组件时需要修改多个现有组件,维护困难。
(三)中介者模式实现
- 定义同事类接口
java
public abstract class UIControl {protected Mediator mediator;public void setMediator(Mediator mediator) {this.mediator = mediator;}public abstract void update();
}
- 具体同事类(输入框、按钮、标签)
java
public class TextInput extends UIControl {private String text;public void setText(String text) {this.text = text;mediator.colleagueChanged(this);}public String getText() {return text;}@Overridepublic void update() {// 输入框一般不需要主动更新,由中介者触发其他组件}
}public class Button extends UIControl {private boolean enabled = false;public void setEnabled(boolean enabled) {this.enabled = enabled;System.out.println("按钮状态:" + (enabled ? "可用" : "不可用"));}@Overridepublic void update() {// 根据中介者指令更新状态}
}
- 中介者接口与实现
java
public interface Mediator {void colleagueChanged(UIControl control);
}public class FormMediator implements Mediator {private TextInput usernameInput;private TextInput passwordInput;private Button submitButton;private Label statusLabel;public void setUsernameInput(TextInput input) {usernameInput = input;}public void setPasswordInput(TextInput input) {passwordInput = input;}public void setSubmitButton(Button button) {submitButton = button;}public void setStatusLabel(Label label) {statusLabel = label;}@Overridepublic void colleagueChanged(UIControl control) {if (control == usernameInput || control == passwordInput) {boolean isInputValid = !usernameInput.getText().isEmpty() && !passwordInput.getText().isEmpty();submitButton.setEnabled(isInputValid);} else if (control == submitButton) {statusLabel.setText("注册成功!");}}
}
- 客户端组装
java
public class GUIClient {public static void main(String[] args) {FormMediator mediator = new FormMediator();TextInput usernameInput = new TextInput();TextInput passwordInput = new TextInput();Button submitButton = new Button();Label statusLabel = new Label();usernameInput.setMediator(mediator);passwordInput.setMediator(mediator);submitButton.setMediator(mediator);statusLabel.setMediator(mediator);mediator.setUsernameInput(usernameInput);mediator.setPasswordInput(passwordInput);mediator.setSubmitButton(submitButton);mediator.setStatusLabel(statusLabel);usernameInput.setText("admin"); // 密码为空,按钮不可用passwordInput.setText("123456"); // 输入合法,按钮可用submitButton.click(); // 触发注册,显示成功信息}
}
(四)模式优势体现
- 组件解耦:输入框、按钮、标签之间无需直接引用,只需与中介者交互,降低了组件间的耦合度。
- 逻辑集中:所有组件的协作逻辑集中在中介者中,易于维护和扩展,例如增加新的验证规则只需修改中介者。
- 可重用性:具体同事类(如输入框)可以在其他场景中重用,只要搭配不同的中介者即可实现不同的交互逻辑。
六、最佳实践与注意事项
(一)适用场景判断
- 当对象间的交互呈现复杂的网状结构,导致难以维护时,考虑引入中介者模式。
- 当系统需要将多个对象的协作逻辑从对象本身分离出来,形成独立的模块时,适合使用中介者模式。
(二)避免中介者膨胀
- 中介者不应承担过多的业务逻辑,否则会违背 "单一职责原则",变得臃肿复杂。如果中介者类过于庞大,可能需要重新设计,将部分逻辑分配给同事类或引入更细粒度的中介者。
(三)与其他模式结合使用
- 工厂模式:可以用于创建同事类和中介者对象,提升对象创建的灵活性。
- 策略模式:当中介者需要支持不同的交互策略时,可以结合策略模式,将具体的交互逻辑封装为策略对象。
(四)测试要点
- 由于中介者集中了交互逻辑,需要重点测试中介者对各种交互场景的处理是否正确。
- 同事类的测试应关注其自身业务逻辑,而与其他同事类的交互通过中介者间接测试,确保隔离性。
七、总结:中介者模式的价值与适用边界
中介者模式作为对象间交互的 "粘合剂",在解耦复杂协作关系、提升系统可维护性方面具有不可替代的优势。它通过引入一个中间层,将网状交互转化为星型结构,使得系统结构更加清晰,职责划分更加明确。然而,任何设计模式都有其适用边界:当对象间的交互简单直接时,过度使用中介者模式可能会增加系统复杂度;而当交互逻辑高度复杂且多变时,中介者模式则能发挥其最大价值。
在 Java 开发中,合理运用中介者模式可以有效应对 GUI 组件协作、分布式系统协调、遗留系统重构等复杂场景。通过将交互逻辑集中管理,我们不仅实现了对象的解耦,更重要的是为系统建立了一个清晰的交互枢纽,使得后续的扩展和维护更加从容。正如所有优秀的设计模式一样,中介者模式的精髓在于对问题本质的抽象和对设计原则的深刻理解,只有在恰当的场景下合理运用,才能真正发挥其重构复杂交互场景的优雅力量。
随着软件系统复杂度的不断提升,对象间的交互管理将持续成为架构设计的核心挑战。中介者模式作为应对这一挑战的有效工具,值得每一位开发者深入理解灵活运用。通过不断在实践中积累模式应用经验,我们能够更好地驾驭复杂系统,构建出更加健壮、灵活的软件架构。
相关文章:
深度解析 Java 中介者模式:重构复杂交互场景的优雅方案
一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中,对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时,系统会陷入 "牵一发而动全身" 的困境。中介者模式(Mediator Pattern)作为行…...
(八)深度学习---计算机视觉基础
分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…...
深入剖析原型模式:原理、实现与应用实践
在软件开发的世界里,设计模式如同建筑师手中的蓝图,为复杂系统的构建提供了行之有效的解决方案。其中,原型模式(Prototype Pattern)作为创建型设计模式的重要一员,以其独特的对象创建方式,在提高代码复用性、增强系统灵活性等方面发挥着关键作用。本文将深入剖析原型模式…...
【论文阅读 | CVPR 2024 |RSDet:去除再选择:一种用于 RGB - 红外目标检测的由粗到精融合视角】
论文阅读 | CVPR 2024 |RSDet:去除再选择:一种用于 RGB - 红外目标检测的由粗到精融合视角 1.摘要&&引言2. 方法2.1 “由粗到细”融合策略2.2 冗余光谱去除模块(RSR)2.3 动态特征选择模块(DFS)2.4 去除与选择检…...
WinForms 应用中集成 OpenCvSharp 实现基础图像处理
引言 欢迎关注dotnet研习社,今天我们要讨论的主题是WinForms 应用中集成 OpenCvSharp 实现基础图像处理。 在常规的图像处理软件开发中,图像处理功能是这些应用程序的核心组成部分。无论是简单的照片编辑工具,还是复杂的计算机视觉应用&…...
apache http client连接池实现原理
在java开发中我们经常会涉及到http 请求接口,一般有几种方式: java自带的 HttpURLConnectionokHttpClientapache http client 一般我们使用apache http client会比较多点,在代码中会进行如下调用方式: private static class Htt…...
adb抓包
目录 抓包步骤 步骤 1: 获取应用的包名 步骤 2: 查看单个应用的日志 步骤 3: 使用日志级别过滤器 步骤 4: 高级日志过滤 可能的原因: 解决方案: 额外提示: 日志保存 抓包步骤 连接设备 adb devices 步骤 1: 获取应用的包名 首先…...
C语言---结构体 、联合体、枚举
一、初识结构体 1、结构体类型 结构体和数组都是集合,但是结构体有成员,类型可以不同;数组有成员,类型相同。 int main() {struct tag{member--list //一个或者多个成员,成员变量}variable--list;//可以省略&#x…...
Web Workers 使用指南
文章目录 前言基础使用高级特性 使用 ES Modules实际应用场景图像处理大数据处理轮询任务 性能优化技巧现代开发方式使用 worker-loader (Webpack) Vite中的Worker使用 限制与注意事项DOM限制:通信限制:同源策略:最佳实践 前言 Web Workers 是浏览器提供的 JavaScript 多线程解…...
JVM 与容器化部署调优实践(Docker + K8s)
📌 文章目录 📘 前言1️⃣ 容器环境下 JVM 面临的新挑战2️⃣ JVM 的容器资源感知机制详解3️⃣ JVM 内存调优:如何正确使用堆内存4️⃣ JVM CPU 调优:GC 与编译线程控制5️⃣ Kubernetes 典型配置误区与对策6️⃣ 实战案例&#…...
Android OkHttp控制链:深入理解网络请求的流程管理
OkHttp作为Android和Java平台上广泛使用的HTTP客户端,其核心设计之一就是"控制链"(Chain)机制。本文将深入探讨OkHttp控制链的工作原理、实现细节以及如何利用这一机制进行高级定制。 一、什么是OkHttp控制链 OkHttp控制链是一种责任链模式的实现&#…...
《易经》的数学表达:初级版和高级版
《易经》的数学表达, 一、初级版,可基于以下框架构建, 涵盖符号系统、结构代数及变换规则: 此框架将《易经》抽象为离散数学结构,兼容符号逻辑、概率论与群论,为算法化占断、卦象拓扑分析及跨文化比较提供…...
卷积神经网络基础(十)
之前我们学习了SGD、Momentum和AdaGrad三种优化方法,今天我们将继续学习Adam方法。 6.1.6 Adam 我们知道Momentum参照的是小球在碗中滚动的物理规则进行移动而实现的,AdaGrad为参数的每个元素适当地调整更新步伐。那如果我们将这两种方法融合在一起会不…...
怎么把cursor(Cursor/ollama)安装到指定路径
使用PowerShell命令 打开电脑开始菜单,输入powerShell,使用管理员权限打开powerShell窗口,使用cd命令到cursor或ollama安装包的下载目录,如我的Cursor所在的目录为D:\environment\cursor\soft,输入以下 cd E:\downloa…...
第21天-pyttsx3语音播放功能
示例1:语音参数控制(语速/音量/音调) import pyttsx3def speech_demo():engine = pyttsx3.init()# 获取当前语音参数print("默认语速:", engine.getProperty(rate))print("默认音量:", engine.getProperty(volume))print("可用语音:", engin…...
Multi-Query Attention:传统自注意力( Self-Attention)优化显存和加速方案
本文导读:Multi-Query Attention(MQA)是 Google Research 2022 年提出的一项轻量化注意力技术,通过“多查询、单键值”的设计,把自注意力层的 KV 缓存从 O(hnd) 降到 O(nd),在不牺牲模型精度的前提下大幅节…...
学习路之uniapp--unipush2.0推送功能--服务端推送消息
学习路之uniapp--unipush2.0推送功能--服务端推送消息 一、二、三、 一、 二、 三、...
如何使用AI搭建WordPress网站
人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域,许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一,WordPress 的人工智能插件越来越多也就不足…...
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择 在 Java 开发领域,项目管理工具对于项目的构建、依赖管理等起着至关重要的作用。Maven 和 Gradle 是目前最主流的两款工具,它们各自有着独特的优势和适用场景。本文将对 Maven 与 Gradl…...
Elasticsearch简单集成java框架方式。
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射? 最常用的 Java 客户端 目前官方推荐使用…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)
📅 我们继续 50 个小项目挑战!—— Hidden Search Widget 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…...
python爬虫和逆向:百度翻译数据采集的几种方式
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、官方API方式(推荐)1.1 百度翻译开放平台API二、网页版逆向方式(代码可直接运行)2.1 拿到js加密方法2.2 python解密代码三、浏览器自动化方式3.1 Selenium自动化操作3.2 Playwright自动化四、移动端API逆向4.1 分…...
spring5-配外部文件-spEL-工厂bean-FactoryBean
spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架,以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...
Ubuntu部署私有Gitlab
这个东西安装其实挺简单的,但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑,所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…...
Activiti 7建表语句及注释
Activiti数据库表Oracle兼容DM建表语句及字段注释。 附件下载版地址点这里 --通用属性表 create table ACT_GE_PROPERTY (NAME_ NVARCHAR2(64),VALUE_ NVARCHAR2(300),REV_ INTEGER,primary key (NAME_) );COMMENT ON TABLE ACT_GE_PROPERTY IS 通用属性表;COMMENT ON COLUMN …...
React中使用 Ant Design Charts 图表
// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App,用于展示柱状图 function App() {// 数据源:每个对象代表一个柱子,包含类型(type)和销售额࿰…...
佰力博科技与您探讨压电材料的原理与压电效应的应用
压电材料的原理基于正压电效应和逆压电效应,即机械能与电能之间的双向转换特性。 压电材料的原理源于其独特的晶体结构和电-机械耦合效应,具体可分为以下核心要点: 1. 正压电效应与逆压电效应的定义 正压电效应:当压电…...
vscode打开vue + element项目
好嘞,我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤,让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装:https://code…...
一步步解析 HTTPS
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
使用vue2做一个生成二维码的案例【可当组件使用】
最近有个需求需要用前端来生成一个二维码,就封装了一个简单的组件,这篇文章来分享给大家。 使用的技术: Vue2 Ant Design Vue QRCodeJS2 node版本:16.20 组件样式: 大家可以根据自己的需求来调整代码。 依赖安装&am…...
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决 nameNode错误日志 2025-05-21 16:14:12,218 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: node01/192.168.191.111:8485. Already tried 5 time(s); retry policy is RetryUpToMaximumCoun…...
从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》
Vue.js 模板语法与数据绑定:从基础到实践 关键点 Vue.js 的模板语法使用 HTML 结合特殊指令(如 v-bind、v-on),实现动态界面。插值({{ }})显示数据,指令控制 DOM 行为,双向绑定简化…...
第二章:Android常用UI控件
1、介绍: 控件是界面组成的主要元素,界面中的控件有序排放和完美组合,便可在用户眼前呈现出丰富多彩的页面。 2、常用控件: 一、TextView控件: 在使用手机时,经常会看见一些文本信息,这些文本…...
LeetCode 1004. 最大连续1的个数 III
LeetCode 1004题 “最大连续1的个数 III” 是一道关于数组和滑动窗口的问题。题目描述如下: 题目描述 给定一个由若干 0 和 1 组成的数组 nums,以及一个整数 k。你可以将最多 k 个 0 翻转为 1。返回经过翻转操作后,数组中连续 1 的最大个数…...
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
引言 Apache Flink 社区很开心地宣布,在经过4个月的版本开发之后,Flink CDC 3.4.0 版本已经正式发布。Flink CDC 是流行的流式数据集成框架,CDC 3.4.0 版本强化了框架对于高频表结构变更的支持,框架支持了 batch 执行模式&#x…...
NIFI的处理器:JSLTTransformJSON 2.4.0
该处理器使用JSLT转换FlowFile JSON有效负载的格式。使用转换后的内容创建新的FlowFile,并将其路由到“成功”关系。如果JSLT转换失败,则将原始FlowFile路由到“失败”关系。 需要注意的是,编译JSLT转换可能相当昂贵。理想情况下,…...
k8s-ServiceAccount 配置
在 Kubernetes 中 ServiceAccount 是一种为 Pod 提供身份认证的机制,允许 Pod 以特定的身份访问 Kubernetes API 服务器。 **Role(角色)**是 Kubernetes 中定义权限的资源对象,它只能在特定的命名空间内生效。Role 用于定义一组权…...
Python Lambda 表达式
在 Python 编程中,Lambda 表达式是一个非常强大且实用的工具,它就像一把瑞士军刀,能在各种场景下帮助我们写出简洁、优雅的代码。接下来,就让我们一起深入探索 Python Lambda 表达式的奥秘。 一、Lambda 表达式的基础认知 1…...
【ffmpeg】ffprobe基本用法
ffprobe 是 FFmpeg 工具集中的一个强大命令行工具,主要用于分析多媒体文件(如视频、音频等)的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等,而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …...
Java 代码生成工具:如何快速构建项目骨架?
Java 代码生成工具:如何快速构建项目骨架? 在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。 一、代码生…...
模板初阶【C++】
一、 泛型编程 前言: 我们经常会用到数据的交换,C中的函数重载可以完成 //函数重载 void swap(int& x,int& y) {int tmp x;x y;y tmp; }void swap(double& x, double& y) {double tmp x;x y;y tmp; }void swap(char& x, ch…...
URL 类知识点详解
URL 类知识点详解 1. 基本概念与位置 所属包: java.net.URL核心功能: 表示统一资源定位符(Uniform Resource Locator),用于标识和定位网络资源(如网页、文件、API接口)。支持多种协议:HTTP、HTTPS、FTP、file(本地文件)等。不可变类:一旦创建,内容不可修改(线程安全…...
如何使用redis做限流(golang实现小样)
在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...
OpenHarmony外设驱动使用 (九),Pin_auth
OpenHarmony外设驱动使用 (九) Pin_auth 概述 功能简介 口令认证是端侧设备不可或缺的一部分,为设备提供一种用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册口令后,口令认证模块就可为设备…...
MySQL基础(InnoDB)
✅ InnoDB:支持事务、行级锁、外键。 为什么要用事务? 安全:如果中途发现错误(比如改错分数),可以一键撤销所有操作,就像游戏里的“回档”功能! 原子…...
自建srs实时视频服务器支持RTMP推流和拉流
文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列:https://github.com/juancarlospaco/aw…...
C++性能优化的7大核心策略与实战案例
在大型C项目中,性能优化需从语言特性、系统架构、硬件特性等多维度切入。以下是经过验证的关键技术路径👇 🔧 一、内存管理的极致控制 问题:频繁的动态内存分配会导致性能抖动和内存碎片,尤其在实时系统中可能…...
《国家高等教育智慧平台:重塑学习新时代》
时代之需:平台应运而生 在数字化浪潮席卷全球的当下,高等教育领域也在经历着深刻的变革。数字化技术的迅猛发展,正以前所未有的力量重塑着高等教育的形态。从在线课程的兴起,到虚拟实验室的应用,再到智能化教学工具的普…...
【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)
📦 Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景) 在使用 Django REST Framework(DRF)时,很多人习惯了用 GenericAPIView 或 ViewSet 自动帮我们处理分页。但在某些场景中…...
遨游科普:三防平板有哪些品牌?哪个品牌值得推荐?
在工业数字化与户外作业场景日益多元化的今天,三防平板凭借其卓越的防护性能与功能集成能力,成为电力巡检、地质勘探、应急救援等领域不可或缺的智能终端。所谓“三防”,即防尘、防水、防摔,国际标准IP68与军用标准MIL-STD-810H的…...