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();}}}
}

存在的问题

  1. 业务逻辑分散在各个对象中

  2. 新增模块需要修改现有代码

  3. 错误处理逻辑复杂

  4. 难以实现事务一致性


三、模式结构深度解析

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 性能优化关键点

  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);}
    }

  2. 批量处理优化

    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 可靠性设计要点

  1. 事务一致性

    • 实现两阶段提交协议

    • 使用补偿事务模式

    • 记录详细操作日志

  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 测试策略建议

  1. 中介者单元测试

    @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);
    }

  2. 混沌测试场景

    • 随机断开设备连接

    • 模拟高延迟响应

    • 注入错误消息

    • 测试事务回滚机制


八、总结:模式的选择与演进

8.1 中介者模式 vs 其他模式

模式适用场景关注点
中介者复杂对象交互集中控制通信
观察者一对多依赖事件通知
外观模式简化子系统访问统一入口
代理模式访问控制对象间接访问

8.2 架构演进建议

  1. 初期阶段:在局部复杂交互处引入简单中介者

  2. 中期扩展:逐步抽象为通用协调框架

  3. 成熟阶段:支持插件化扩展和动态配置

  4. 云原生演进:演变为Service Mesh的Sidecar模式

8.3 未来发展方向

  1. AI驱动的智能路由:使用机器学习优化消息路径

  2. 区块链协调器:基于智能合约的分布式中介

  3. 边缘计算协调:跨边缘节点的协同中介

  4. 量子计算适配:设计量子友好的协调算法


通过本文的深度扩展,我们不仅掌握了中介者模式的基础用法,更深入探讨了其在复杂系统架构中的高级应用场景。在实际项目中,建议根据具体需求灵活运用模式的变体和优化策略,同时注意平衡模式的收益与复杂度成本。中介者模式的价值在分布式系统日益复杂的今天愈发重要,是构建可维护、可扩展系统的重要工具之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/78954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化

一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…

LeetCode 热题 100_单词拆分(86_139_中等_C++)(动态规划)

LeetCode 热题 100_单词拆分&#xff08;86_139&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;动态规划&#xff09;&a…

VM虚拟机安装及Ubuntu安装配置

VM虚拟机安装及Ubuntu安装配置 1、VM虚拟机安装2、创建虚拟机3、Ubuntu系统安装4、编译环境配置4.1 、Ubuntu和 Windows文件互传 文件互传4.1.1、 开启Ubunt下的FTP服务 4.2、 Ubuntu下NFS和SSH服务开启4.2.1、 NFS服务开启4.2.2、 SSH服务开启 4.3、 交叉编译器安装4.3.1 安装…

【KWDB 创作者计划】_产品技术解读_1

【KWDB 创作者计划】_产品技术解读_1 一、存储引擎:高性能混合存储架构1. 存储模型设计2. 存储压缩与编码3. 持久化策略二、KWDB 组件源码解析1. 核心模块分层架构2. 关键组件源码剖析三、KWDB 特性代码通读1. 实时分析能力(Real-Time OLAP)2. 混合负载隔离(HTAP)3. 智能索…

高速电路中的电阻、电容的选型及应用

2.1 电阻的应用 2.1.1 与电阻相关的经典案例 如果说芯片是电路的骨架&#xff0c;那么电阻就是在芯片之间起连接作用的关节。电阻的阻值、布放位置等&#xff0c;对设计的成功起着至关重要的作用。 【案例2.1】串联电阻过大&#xff0c;导致板间告警失败 某产品由业务板和主…

springBoot接入文心一言

文章目录 效果接入步骤项目接入配置类&#xff1a;WenXinYiYan前端vue代码js代码 后端mapper层service层controller层 测试代码 效果 先来看一下最后实现的效果 &#xff08;1&#xff09;未点击前的功能页面 &#xff08;2&#xff09;点击后的页面 &#xff08;3&#xff…

css解决边框四个角有颜色

效果 html <div class"gradient-corner">2021年</div>css background:/* 左上角横线 */linear-gradient(90deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 左上角竖线 */linear-gradient(0deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 右上…

自动化三维扫描:CASAIM外观尺寸智能检测

制造业向智能化、数字化加速转型&#xff0c;传统检测方式因效率低、精度差、数据断层等问题&#xff0c;已难以满足现代工业对精密测量与实时质控的需求。CASAIM依托前沿技术实力&#xff0c;以自动化三维扫描为核心&#xff0c;为工业检测提供了从数据采集到智能分析的全流程…

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

目录 一、Web Unlocker API简介二、开始使用Web Unlocker API1、首先进入控制台页面&#xff0c;点击左侧第一个tab键“代理 & 抓取基础设施”&#xff0c;找到“网页解锁器”&#xff0c;开始使用。2、进入网页解锁器页面后&#xff0c;填写通道名称&#xff0c;添加简短描…

【力扣05】最长回文子串

0. 引言 ●子串(substring&#xff09;&#xff1a;原始字符串的一个连续子集; ●子序列&#xff08;subsequence&#xff09;&#xff1a;原始字符串的一个子集。 1. 什么叫回文串&#xff1f; 如果一个字符串正着读和反着读是一样的&#xff0c;那它就是回文串。[1] 例如&…

统计销量前十的订单

传入参数&#xff1a; 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…

【HDFS入门】HDFS核心组件Secondary NameNode角色职责与运行机制解析

目录 1 Secondary NameNode的角色定位与常见误解 2 核心职责详解 2.1 核心功能职责 2.2 与NameNode的协作关系 3 运行机制深度剖析 3.1 检查点触发机制 3.2 元数据合并流程 4 与Hadoop 2.0 HA架构的对比 5 配置调优指南 5.1 关键配置参数 5.2 性能优化建议 6 实践应…

MySQL存储引擎:存储什么意思?引擎什么意思?存储引擎是什么?在MySQL中有什么作用?

MySQL存储引擎详解 一、术语解析 “存储”与“引擎”的汉语词典解释 1. 存储&#xff08;chǔ cn&#xff09; 汉语词典释义&#xff1a; • 动词&#xff1a; • 存放、保存&#xff08;将物品或信息放置在特定地方&#xff0c;以便后续使用&#xff09;。 ◦ 例&#xff…

测试第三课-------自动化测试相关

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Hive null safe的用法

总结: null safe 是用<> 代表比较&#xff0c;而不是用 。null <> null 返回 true&#xff0c; 而 null null 代表 false。 NULL 和任意字符比较都返回 NULL&#xff0c;而不是 true 或者 false。如 SELECT 1 1, NULL NULL, 1 NULL;输出 true NULL NULL如果我…

LINUX基础 [四] - Linux工具

目录 软件包管理器yum Linux开发工具vim vim的基本概念 vim的三种常用模式 vim的简单配置 vim常用模式的基本操作 命令模式 底行模式 处理vim打开文件报错的问题 Linux编译器-gcc/g使用 为什么我们可以用C/C做开发呢&#xff1f; 预处理&#xff08;进行宏替换&#x…

RocketMQ 03

今天是2025/04/14 21:58 day 20 总路线请移步主页Java大纲相关文章 今天进行RocketMQ 6,7,8 个模块的归纳 最近在忙毕设&#xff0c;更新有点慢&#xff0c;见谅 首先是RocketMQ 的相关内容概括的思维导图 6. 安全机制 6.1 ACL 访问控制 核心功能 权限分级&#xff1a;通过…

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)

文章目录 前言imgproc 基础操作&#xff08;上&#xff09;1. 颜色空间2. 直方图3. 二值化4. 腐蚀、膨胀、开闭运算5. 梯度与轮廓6. 简易绘图7. 重映射 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#x…