Java设计模式之中介者模式:从入门到架构级实践
一、什么是中介者模式?
中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过引入一个中介对象来封装多个对象之间的交互关系。这种模式将原本复杂的网状通信结构转换为星型结构,类似于现实生活中的机场塔台调度系统:所有飞机不再需要与其他飞机直接通信,而是统一通过塔台协调飞行路线和起降顺序。
模式特点扩展:
-
通信标准化:定义统一的交互协议
-
状态管理:中介者可以维护全局状态
-
事务协调:支持跨对象的事务操作
-
动态路由:根据运行时条件决定消息流向
二、为什么需要中介者模式?——深入痛点分析
2.1 复杂系统通信问题
在大型软件系统中,当对象间存在以下通信特征时,系统复杂度会急剧上升:
-
多对多依赖:一个对象需要与多个对象交互
-
交叉调用:对象间的调用形成循环依赖
-
状态同步:需要保持多个对象状态的一致性
-
条件路由:消息传递需要基于特定业务规则
典型案例:电商订单系统
-
订单创建需要联动库存、支付、物流等多个模块
-
库存锁定失败需要回滚支付操作
-
物流状态变更需要通知用户和商家
2.2 传统实现的问题
// 没有中介者时的典型代码结构
class Order {private InventoryService inventory;private PaymentService payment;private LogisticsService logistics;public void createOrder() {if(inventory.lockStock()) {if(payment.processPayment()) {logistics.scheduleDelivery();} else {inventory.releaseStock();}}}
}
存在的问题:
-
业务逻辑分散在各个对象中
-
新增模块需要修改现有代码
-
错误处理逻辑复杂
-
难以实现事务一致性
三、模式结构深度解析
3.1 核心角色扩展说明
1. 抽象中介者(Mediator)—— 通信协议设计
public interface OrderMediator {// 注册组件void register(String componentName, OrderComponent component);// 事件通知方法void notifyEvent(OrderComponent sender, OrderEvent event);// 事务补偿接口void rollback(OrderTransaction transaction);// 状态查询接口OrderSystemState getCurrentState();
}
2. 具体中介者(ConcreteMediator)—— 业务规则实现
public class OrderCoordinator implements OrderMediator {private Map<String, OrderComponent> components = new ConcurrentHashMap<>();private OrderSystemState systemState = new OrderSystemState();private TransactionLog transactionLog = new TransactionLog();@Overridepublic void notifyEvent(OrderComponent sender, OrderEvent event) {// 使用策略模式处理不同事件类型EventHandler handler = EventHandlerFactory.getHandler(event.getType());handler.handle(this, sender, event);}// 实现事务补偿@Overridepublic void rollback(OrderTransaction transaction) {transaction.getSteps().reverse().forEach(step -> {OrderComponent component = components.get(step.getComponentName());component.compensate(step.getParameters());});}
}
3. 抽象同事类(Colleague)—— 组件标准化
public abstract class OrderComponent {protected OrderMediator mediator;protected String componentName;protected ComponentHealth healthStatus;public OrderComponent(String name, OrderMediator mediator) {this.componentName = name;this.mediator = mediator;mediator.register(name, this);}// 统一的生命周期接口public abstract void initialize();public abstract void shutdown();// 事务操作接口public abstract boolean execute(OrderCommand command);public abstract void compensate(Map<String, Object> params);// 健康检查public ComponentHealth checkHealth() {return healthStatus;}
}
四、代码实现:智能家居控制系统(增强版)
4.1 场景扩展需求
在原有基础上增加:
-
设备离线处理机制
-
场景模式支持(离家模式、睡眠模式)
-
能耗监控与报警
-
异步事件处理
4.2 增强版中介者实现
public class SmartHomeHub implements SmartHomeMediator {private Map<String, Device> devices = new ConcurrentHashMap<>();private ExecutorService asyncExecutor = Executors.newFixedThreadPool(4);private EnergyMonitor energyMonitor = new EnergyMonitor();private AlertSystem alertSystem = new AlertSystem();@Overridepublic void notify(Device sender, DeviceEvent event) {// 异步处理事件asyncExecutor.submit(() -> {try {processEvent(sender, event);} catch (Exception e) {handleError(sender, event, e);}});}private void processEvent(Device sender, DeviceEvent event) {// 记录设备活动energyMonitor.recordActivity(sender.getId(), event.getType());// 根据事件类型路由处理switch (event.getType()) {case "MOTION_DETECTED":handleMotionEvent(sender, event);break;case "TEMPERATURE_CHANGE":handleTemperatureEvent(sender, event);break;case "DEVICE_OFFLINE":handleOfflineEvent(sender, event);break;// 其他事件类型...}}private void handleOfflineEvent(Device sender, DeviceEvent event) {// 启动设备健康检查if (!checkDeviceHealth(sender)) {alertSystem.triggerAlert("设备离线警告: " + sender.getId());// 自动切换到备用设备failoverToBackup(sender);}}// 其他处理方法...
}
4.3 设备类的增强实现
public class SmartThermostat extends Device {private TemperatureSchedule schedule;private boolean isEnergySavingMode;@Overridepublic void execute(DeviceCommand command) {switch (command.getType()) {case "SET_TEMPERATURE":setTemperature((Double) command.getParam("value"));break;case "ENERGY_SAVING_MODE":enableEnergySaving((Boolean) command.getParam("enable"));break;}}private void setTemperature(double temp) {// 实际温度控制逻辑System.out.println("Setting temperature to: " + temp);// 触发温度变化事件mediator.notify(this, new DeviceEvent("TEMPERATURE_CHANGED", Map.of("newTemp", temp, "oldTemp", currentTemp)));}@Overridepublic void handleEvent(DeviceEvent event) {if ("ENERGY_ALERT".equals(event.getType())) {enableEnergySaving(true);}}
}
五、架构级应用实践(深度扩展)
5.1 微服务API网关的进阶实现
增强功能需求:
-
动态路由配置
-
服务熔断降级
-
请求/响应转换
-
分布式链路追踪
public class AdvancedApiGateway implements Mediator {private ServiceRegistry registry;private CircuitBreakerManager circuitBreakers;private RequestTransformer transformer;private TracingContext tracer;public Response handleRequest(Request request) {// 1. 链路追踪初始化Span span = tracer.startSpan("gateway.handle");try {// 2. 协议转换InternalRequest internalReq = transformer.transform(request);// 3. 服务发现ServiceEndpoint endpoint = registry.discover(internalReq.getService());// 4. 熔断检查if (circuitBreakers.isOpen(endpoint)) {return fallbackResponse(internalReq);}// 5. 负载均衡选择实例ServiceInstance instance = loadBalancer.select(endpoint);// 6. 请求转发Response response = instance.call(internalReq);// 7. 响应转换return transformer.transform(response);} catch (Exception e) {span.recordException(e);throw e;} finally {span.end();}}// 服务注册回调接口public void onServiceRegistered(ServiceEvent event) {// 动态更新路由表registry.update(event.getService(), event.getInstances());// 初始化新的熔断器circuitBreakers.createIfAbsent(event.getService());}
}
5.2 事件驱动架构中的消息中间件优化
高级特性实现:
-
消息持久化保证
-
死信队列处理
-
消息优先级支持
-
事务消息支持
public class ReliableMessageBroker implements Mediator {private MessageStore messageStore;private PriorityDispatcher dispatcher;private DeadLetterQueue dlq;public void publish(String topic, Message message) {// 事务管理Transaction tx = messageStore.beginTransaction();try {// 1. 持久化存储messageStore.store(topic, message, tx);// 2. 分发到订阅者List<Consumer> consumers = dispatcher.getSubscribers(topic);for (Consumer consumer : consumers) {dispatchToConsumer(consumer, message);}tx.commit();} catch (Exception e) {tx.rollback();dlq.store(topic, message, e);}}private void dispatchToConsumer(Consumer consumer, Message message) {try {if (consumer.getPriority() > message.getPriority()) {// 低优先级消息延迟处理delayQueue.put(message, 5000);return;}consumer.consume(message);} catch (ConsumerException e) {if (e.isRetryable()) {retryLater(message);} else {dlq.store(message, e);}}}
}
六、模式进阶与变体(实战扩展)
6.1 分布式Saga事务协调器实现
public class SagaMediator implements Mediator {private Map<String, SagaParticipant> participants = new HashMap<>();private SagaLogStore logStore = new SagaLogStore();public void coordinate(Saga saga) {SagaContext context = new SagaContext();try {for (SagaStep step : saga.getSteps()) {SagaParticipant participant = participants.get(step.getService());// 记录操作日志logStore.logStepStart(step);// 执行正向操作boolean success = participant.execute(step.getAction(), context);if (!success) {throw new SagaAbortException("Step failed: " + step);}// 记录补偿点context.addCompensationPoint(step);}logStore.logSagaComplete(saga);} catch (Exception e) {logStore.logSagaAbort(saga, e);compensate(context);}}private void compensate(SagaContext context) {context.getCompensationPoints().reverse().forEach(step -> {SagaParticipant participant = participants.get(step.getService());try {participant.compensate(step.getAction(), context);} catch (Exception e) {// 记录补偿失败logStore.logCompensationFailure(step, e);}});}
}
6.2 中介者与CQRS模式的结合
public class CqrsMediator implements Mediator {private CommandBus commandBus;private QueryBus queryBus;private EventPublisher eventPublisher;public <T> T execute(Command<T> command) {// 1. 命令校验validateCommand(command);// 2. 命令路由CommandHandler<T> handler = commandBus.findHandler(command);// 3. 执行命令T result = handler.handle(command);// 4. 发布领域事件List<DomainEvent> events = handler.getGeneratedEvents();eventPublisher.publish(events);return result;}public <T> T query(Query<T> query) {QueryHandler<T> handler = queryBus.findHandler(query);return handler.handle(query);}
}
七、注意事项与最佳实践(深度总结)
7.1 性能优化关键点
-
异步处理:
// 使用CompletableFuture实现异步中介 public class AsyncMediator {private Executor executor = ForkJoinPool.commonPool();public <T> CompletableFuture<T> mediateAsync(MediationTask<T> task) {return CompletableFuture.supplyAsync(() -> {try {return processTask(task);} catch (Exception e) {throw new CompletionException(e);}}, executor);} }
-
批量处理优化:
public void batchNotify(List<Notification> notifications) {Map<String, List<Notification>> grouped = notifications.stream().collect(Collectors.groupingBy(Notification::getTargetType));grouped.forEach((type, list) -> {BatchProcessor processor = processorRegistry.getProcessor(type);processor.processBatch(list);}); }
7.2 可靠性设计要点
-
事务一致性:
-
实现两阶段提交协议
-
使用补偿事务模式
-
记录详细操作日志
-
-
错误恢复机制:
public class RetryMediator implements Mediator {private static final int MAX_RETRIES = 3;public void sendWithRetry(Message message) {int attempts = 0;while (attempts < MAX_RETRIES) {try {doSend(message);return;} catch (NetworkException e) {attempts++;waitForRetry(attempts);}}throw new SendFailedException("Max retries exceeded");} }
7.3 测试策略建议
-
中介者单元测试:
@Test void testTemperatureEventHandling() {// 初始化SmartHomeHub hub = new SmartHomeHub();TemperatureSensor sensor = new TemperatureSensor("sensor1", hub);SmartThermostat thermostat = new SmartThermostat("thermo1", hub);// 触发事件sensor.detectTemperatureChange(25.0);// 验证结果assertThat(thermostat.getCurrentTemp()).isEqualTo(25.0);assertThat(hub.getEnergyUsage()).isGreaterThan(0); }
-
混沌测试场景:
-
随机断开设备连接
-
模拟高延迟响应
-
注入错误消息
-
测试事务回滚机制
-
八、总结:模式的选择与演进
8.1 中介者模式 vs 其他模式
模式 | 适用场景 | 关注点 |
---|---|---|
中介者 | 复杂对象交互 | 集中控制通信 |
观察者 | 一对多依赖 | 事件通知 |
外观模式 | 简化子系统访问 | 统一入口 |
代理模式 | 访问控制 | 对象间接访问 |
8.2 架构演进建议
-
初期阶段:在局部复杂交互处引入简单中介者
-
中期扩展:逐步抽象为通用协调框架
-
成熟阶段:支持插件化扩展和动态配置
-
云原生演进:演变为Service Mesh的Sidecar模式
8.3 未来发展方向
-
AI驱动的智能路由:使用机器学习优化消息路径
-
区块链协调器:基于智能合约的分布式中介
-
边缘计算协调:跨边缘节点的协同中介
-
量子计算适配:设计量子友好的协调算法
通过本文的深度扩展,我们不仅掌握了中介者模式的基础用法,更深入探讨了其在复杂系统架构中的高级应用场景。在实际项目中,建议根据具体需求灵活运用模式的变体和优化策略,同时注意平衡模式的收益与复杂度成本。中介者模式的价值在分布式系统日益复杂的今天愈发重要,是构建可维护、可扩展系统的重要工具之一。
相关文章:
Java设计模式之中介者模式:从入门到架构级实践
一、什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过引入一个中介对象来封装多个对象之间的交互关系。这种模式将原本复杂的网状通信结构转换为星型结构,类似于现实生活中的机…...
L2TP通道基础实验
目录 实验拓扑: 一、需求配置LAC设置: 界面设置: 编辑LNS设置: 建立静态路由:编辑 策略配置: 二、测试 通讯测试: 实验拓扑: 一、需求配置 LAC设置: [LAC]l2…...
关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析
以下是关于豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析: 一、豆包(DouBao)详解 豆包是字节跳动推出的一款多功能人工智能助手,主打“智能助手场景化工具”结合,覆盖日常生活、…...
如何在本地修改 Git 项目的远程仓库地址
✅ 场景说明 你当前的 Git 项目地址是: http://192.168.0.16/xxx.git你希望把它改成: http://192.168.0.22:8099/xxx.git🧩 操作步骤 步骤 ①:进入项目所在目录 你已经在正确路径下了: cd C:\Develop\xxx确认这个…...
Gitea 1.23.7 速配
复用容器内的postgresql CREATE USER gitea WITH PASSWORD gitea; CREATE DATABASE gitea; GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea; docker-compose.yml 内容 gitea:image: gitea/gitea:latestcontainer_name: giteaenvironment:- GITEA__server__HTTP_ADDR0.0.0.…...
JavaScript — 函数定义
介绍 JavaScript函数是执行特定任务的代码块,可通过多种方式定义。传统函数声明使用function关键字,后接函数名和参数列表,这种声明会被提升至作用域顶部。函数表达式则将匿名或具名函数赋值给变量,遵循变量作用域规则࿰…...
Allure安装与使用【macOS】
安装: brew install allure 安装插件: pip install allure-pytest2.8.16 生成一个html格式的报告,步骤: 执行生成json,制定结果保存目录 pytest --alluredirreport test_demo.py 查看测试保报告方式 将json转成h…...
FireCrawl爬虫工具, Craw4ai
FireCrawl是一款开源的AI爬虫工具,专门用于Web数据提取,并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站,能够自动抓取网站及其所有可访问的子页面内容,并将其转换为适合大语言…...
【Python爬虫】详细入门指南
目录 一、简单介绍 二、详细工作流程以及组成部分 三、 简单案例实现 一、简单介绍 在当今数字化信息飞速发展的时代,数据的获取与分析变得愈发重要,而网络爬虫技术作为一种能够从互联网海量信息中自动抓取所需数据的有效手段,正逐渐走入…...
Cesium.Cesium3DTileset设置贴地,tileset.readyPromise.then报错
tileset.readyPromise.then(function(tileset) { }); 用的readyPromise函数,却报错了,通过参考别人的博客内容发现最终修改的是 modelMatrix这个参数的内容,所以直接舍弃使用readyPromise函数,在代码中等 viewer.scene.primitiv…...
卫星电话扬帆智慧海洋,构筑蓝海通信新生态
海洋,承载着全球90%的贸易运输量,更是我国“向海图强”战略的核心战场。但是,全球95%的海洋区域仍处于蜂窝网络覆盖的“真空地带”,近海信号不稳、远洋通信中断的难题长期制约着海洋经济的纵深发展。技术革新是推动发展的强大引擎…...
大模型不是在推理,只是在复述??
目的 看见一篇论文Recitation over Reasoning: How Cutting-Edge Language Models Can Fail on Elementary School-Level Reasoning Problems?,论文中建立了一个推理题库,通过将推理问题进行改写(通过只改写几个字,颠覆整个问题…...
安全编码课程 实验7 并发
实验项目:C 多线程中的数据竞争与同步机制 实验要求: 1. 编写基础代码:模拟账户余额取款 创建一个全局共享变量 int balance 100,表示初始余额; 创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元&a…...
【vue】2.16简单案例
一、高亮显示点击文字 使用vue绑定页面 设置默认样式 使用for循环数组数据展示,并取得索引 创建点击事件并传承,创建num变量 方法中num传进来的参数, 在内容中使用:class和三元运算符,当numkey时是true显示,…...
多线程进阶知识篇(一)
文章目录 一、开启线程1. start()2. run() 二、单核/多核CPU1. 单核CPU2. 多核CPU3.烧水问题 三、操作线程的命令四、并发的本质五、线程上下文切换1. 定义2. 原因 一、开启线程 1. start() 调用 start() 方法会启动一个新的线程,每次调用 start(),线程…...
【benepar】benepar安装会自动更新pytorch
直接pip install benepar,安装benepar0.2.0时会自动更新torch的版本 解决方法:去https://pypi.org/project/benepar/0.1.3/找历史版本 我的适配版本:python3.9,torch1.11.0(cuda11.3),对应的ben…...
智能云图库-1-项目初始化
项目中的异常处理 自定义异常 在exception包下新建错误码枚举类: Getter public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "请求参数错误"),NOT_LOGIN_ERROR(40100, "未登录"),NO_AUTH_ERROR(40101, "无权限&q…...
每日算法-250414
每日算法学习记录 - 240414 记录今天学习和解决的两道 LeetCode 算法题,主要涉及二分查找的应用。 162. 寻找峰值 题目描述 思路分析 核心思想:二分查找 题目要求找到数组中的任意一个峰值。峰值定义为比其相邻元素都大的元素。题目还隐含了一个条件…...
鸿蒙NEXT开发格式化工具类(ArkTs)
import { i18n } from kit.LocalizationKit;/*** 格式化工具类* 提供电话号码格式化、归属地查询、字符转换等功能。* author: 鸿蒙布道师* since: 2025/04/14*/ export class FormatUtil {/*** 判断传入的电话号码格式是否正确。* param phone - 待验证的电话号码* param coun…...
HarmonyOS 第2章 Ability的开发,鸿蒙HarmonyOS 应用开发入门
第2章 Ability的开发 本章内容 本章介绍HarmonyOS的核心组件Ability的开发。 2.1 Ability概述 2.2 FA模型介绍 2.3 Stage模型介绍 2.4 Ability内页面的跳转和数据传递 2.5 Want概述 2.6 实战:显式Want启动Ability 2.7 实战:隐式Want打开应用管理 2.8 小结 2.9 习题 2.1 Abili…...
CS5346 - Interactivity in Visualization 可视化中的交互
文章目录 Visualization representation interactionInteraction (交互)Benefits (好处)Typical Interaction Techniques(交互技术)SelectFilteringAbstract / Elaborate几何放缩(Geometric zoom)语义放缩࿰…...
AI与我共创WEB界面
记录一次压测后的自我技术提升 这事儿得从机房停电说起。那天吭哧吭哧做完并发压测,正准备截Zabbix监控图写报告,突然发现监控曲线神秘失踪——系统组小哥挠着头说:“上次停电后,zabbix服务好像就没起来过…” 我盯着空荡荡的图表界面,大脑的CPU温度可能比服务器还高。 其…...
python蓝桥杯备赛常用算法模板
一、python基础 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #结果 #{1, 2, 3, 4, 5} #{3}(二)对多维列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每个小列表的下标为2的…...
代码随想录第17天:二叉树
一、二叉搜索树的最近公共祖先(Leetcode 235) 由于是二叉搜索树,节点的值有严格的顺序关系:左子树的节点值都小于父节点,右子树的节点值都大于父节点。利用这一点,可以在树中更高效地找到最低公共祖先。 c…...
第8篇:Linux程序访问控制FPGA端HEX<一>
Q:如何从DE1-SoC_Computer系统的ARM A9处理器访问FPGA端的七段数码管呢? A:DE1-SoC_Computer系统中有2个连接FPGA端HEX外设的并行端口HEX5_HEX4和HEX3_HEX0,每个端口有一个32位只读Data寄存器。地址为0xFF200020的寄存器驱动4个数…...
Android 添加一个自己的系统服务SystemService
Android 系统服务(System Services)是 Android 操作系统的核心组件,运行在系统层面,为应用程序提供底层硬件访问、系统资源管理以及跨应用功能支持。这些服务在后台持续运行,由系统进程(如 system_server&a…...
git安装(windows)
通过网盘分享的文件:资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用,所以不用创建。 用vscode,所以这么选择。...
C# visionpro联合编程中遇到的问题之 R6025 - pure virtual function call
C# visionpro联合编程中遇到的问题之 R6025 - pure virtual function call R6025 pure virtual function call解决方法步骤 1: 获取所有相机步骤 2: 遍历并关闭相机完整代码 R6025 pure virtual function call 如果错误 “R6025 - pure virtual function call” 发生在关闭窗体…...
OTA技术(一):原理与实现方案
目录 一.引言 二.核心原理 2.1 定义与分类 2.2 系统架构 2.3 典型的升级流程 三.嵌入式系统中的OTA实现方案 3.1 存储空间划分 3.2 关键技术 一.引言 在智能手机上点击系统更新、电动汽车解锁新功能、智能家居设备自动修复漏洞……这些场景背后都离不开一项关键技术——…...
strings.LastIndexAny 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:日志清洗(去除末尾的乱码或非法字符) 8. 性能对比 性能…...
大型商场运营新变革:AcrelCloud - 3200 预付费系统应用全解析
一、方案概述 在现代商业运营和物业管理中,大型商场、商业小区以及大集团和大物业面临着复杂的费用收取和管理难题。安科瑞的 AcrelCloud - 3200 远程预付费管控云平台,借助先进的预付费电表等设备,为解决这些问题提供了高效的一体化解决方案…...
鸿蒙开发07-interface
在 ArkTS(HarmonyOS Ability Runtime TypeScript)中,interface(接口)是一种强大的类型工具,它主要用于定义对象的结构,为对象的属性和方法提供类型约束,帮助开发者编写更加规范、可维…...
Java从入门到“放弃”(精通)之旅——方法的使用⑤
Java从入门到“放弃”(精通)之旅🚀——方法的使用⑤ 📖引言: 在编程领域,代码如同精密的齿轮相互咬合驱动程序运转。随着项目规模渐长,重复的代码片段如同冗余的齿轮,不仅增加负重…...
5 C 程序全流程解析:编写、预处理、编译、汇编、链接、运行与 GCC 指令详解
1 C 程序运行机制流程概述 通过以上步骤,我们可以将一个 C 语言源代码文件逐步转换为一个可执行的二进制程序。这一过程涉及多个关键工具和步骤,每一步都承担着特定的任务,发挥着独特的作用。深入理解这些步骤,不仅有助于我们更好…...
leetcode:1351. 统计有序矩阵中的负数(python3解法)
难度:简单 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非严格递减顺序排列。 请你统计并返回 grid 中 负数 的数目。 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]] 输…...
hive数仓要点总结
1.OLTP和OLAP区别 OLTP(On-Line Transaction Processing)即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用…...
LeetCode[541]反转字符串Ⅱ
思路: 题目给我们加了几个规则,剩余长度小于2k,大于等于k就反转k个,小于k就全部反转,我们按照这个逻辑来就行。 第一就是大于等于k就反转k个,我们for循环肯定是i2k了,接下来就是判断是否大于等于…...
瑞幸微RK系列平台的YOLO部署(上篇)
🎇环境配置 🎉前言 部署的第一步是对环境的配置,不同的平台的平台需要依赖的环境不同,之前在英伟达的Jetson系列部署过,其主要是需要配置CUDA和CUDNN的环境,需要加速推理的话可能还需要TensorRT的环境。 …...
HarmonyOS:页面滚动时标题悬浮、背景渐变
一、需求场景 进入到app首页或者分页列表首页时,随着页面滚动,分类tab要求固定悬浮在顶部。进入到app首页、者分页列表首页、商品详情页时,页面滚动时,顶部导航栏(菜单、标题)背景渐变。 二、相关技术知识点…...
无人设备遥控器之安全防护与预警篇
无人设备遥控器的安全防护与预警是保障无人机、无人船、无人车等无人系统安全运行的关键环节。随着无人设备在农业、测绘、物流、安防等领域的广泛应用,其遥控器的安全性与可靠性显得尤为重要。 一、安全防护 1. 物理安全防护 外壳防护:采用防水、防尘…...
win10win11启用组策略编辑器
今天发现家庭版的win11系统没有组策略编辑器, 桌面新建txt文件,打开 编写以下脚本: echo off pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >Li…...
谷歌浏览器的开发者模式如何开启及安装教程
在谷歌浏览器(Google Chrome)中开启开发者模式并安装扩展程序(如未上架商店的插件或自定义扩展)的步骤如下: 一、开启开发者模式 打开扩展管理页面 在浏览器地址栏输入:chrome://extensions/ 或通过菜单进入…...
WebRTC实时通话EasyRTC嵌入式音视频通信SDK,构建智慧医疗远程会诊高效方案
一、方案背景 当前医疗领域,医疗资源分布不均问题尤为突出,大城市和发达地区优质医疗资源集中,偏远地区医疗设施陈旧、人才稀缺,患者难以获得高质量的医疗服务,制约医疗事业均衡发展。 EasyRTC技术基于WebRTC等先进技…...
C++性能优化实战:从瓶颈定位到高并发架构重构(第一章)
在高并发编程的世界中,性能瓶颈往往潜伏在代码的深处,悄无声息地吞噬着系统的吞吐量。想象一下,你正在开发一个游戏服务器,需要在每毫秒内为数千名玩家分配和释放内存,任何微小的延迟都可能导致玩家体验的崩塌。你是否曾遇到过这样的困惑:增加了线程数,期待性能翻倍,结…...
Terraform 迷思:当优雅的模块 terraform-aws-eks 与现实碰撞
大家好,今天想和大家聊聊一个可能很多技术人都经历过的场景——面对看似完美的工具或代码库,却陷入意想不到的困境,甚至开始有点怀疑人生的时刻。 启程:雄心勃勃的 EKS 模块优化 故事的开端往往充满希望。就像我今天࿰…...
路由器端口映射的意思、使用场景、及内网ip让公网访问常见问题和解决方法
一、端口映射是什么意思 端口映射是将内网主机的IP地址端口映射到公网中,内部机器提供相应的互联网服务。当异地用户访问该这个端口时,会自动将请求映射到对应局域网内部的机器上。 二、端口映射常见使用场景 1,远程访问需求。当有…...
【MySQL 数据库】增删查改操作CRUD(下)
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 聚合函数 1.1 常见聚合函数 1.1.1 COUNT 1.1.2 SUM 1.1.3 AVG 1.1.4 MAX 2. Group by 分组 2.1 分组示例 3. having 语句 3.1 having 过滤结果 3…...
Android 日志输出模块
Android 日志输出模块 本文主要记录下封装的日志输出模块. 1: 主要功能 日志模块初始化,并设置日志级别支持将日志写入文件日志文件单个限制200M,按天记录到指定文件,文件达到阈值后,记录新的日志文件.支持导出日志文件zip. 2: 具体实现 日志整体初始化使用静态内部类的方式…...
群辉搭建静态网站
写在前面,本文章主要是记录自己搭建过程以备后来需要时温习下! 1.安装并打开web station 2. 2.打开 File Station 找到web文件夹 把静态导航网站的代码下载下来,并上传到上面 web 文件夹下 3. 在Web Station 套件里面,在网页服…...
51单片机波特率与溢出率的关系
1. 波特率与溢出率的基本关系 波特率(Baud Rate)表示串口通信中每秒传输的位数(bps),而溢出率是定时器每秒溢出的次数。在51单片机中,波特率通常通过定时器的溢出率来生成。 公式关系: 波特率=溢出率/分频系数 其中,分频系数与定时器的工作模…...