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

Spring Boot中的中介者模式:终结对象交互的“蜘蛛网”困境

 前言

当系统中对象交互复杂如"蜘蛛网"时,中介者模式就是你的架构救星!本文将揭秘如何用中介者模式优雅解耦对象通信,让系统维护成本直降80%!

一、中介者模式:对象交互的交通指挥官

1.1 现实中的中介者模式

想象一个电商订单系统:

  • 用户下单 → 通知库存系统

  • 支付成功 → 通知物流系统

  • 发货完成 → 通知用户系统

传统实现痛点

// 支付服务中耦合多个系统调用
public class PaymentService {public void processPayment(Order order) {// 支付处理逻辑paymentGateway.charge(order);// 直接调用多个系统(高耦合)inventoryService.reduceStock(order);  // 通知库存shippingService.scheduleDelivery(order); // 通知物流notificationService.sendEmail(order.getUser()); // 通知用户pointsService.addPoints(order.getUser(), order.getAmount()); // 增加积分}
}

1.2 中介者模式核心思想

图片

四大核心组件

  1. Mediator(中介者):定义对象间通信的接口

  2. ConcreteMediator(具体中介者):协调各对象,实现协作逻辑

  3. Colleague(同事类):定义与其他对象通信的接口

  4. ConcreteColleague(具体同事类):通过中介者与其他对象通信

二、Spring Boot中的中介者模式实战

订单处理场景

假设订单流程需要协调:

  • 支付服务

  • 库存服务

  • 物流服务

  • 通知服务

  • 积分服务

步骤1:定义中介者接口

public interface OrderMediator {void notify(Object sender, String event, Order order);
}
步骤2:实现具体中介者
@Component
public class OrderProcessingMediator implements OrderMediator {@Autowiredprivate PaymentService paymentService;@Autowiredprivate InventoryService inventoryService;@Autowiredprivate ShippingService shippingService;@Autowiredprivate NotificationService notificationService;@Autowiredprivate PointsService pointsService;@Overridepublic void notify(Object sender, String event, Order order) {if ("PAYMENT_SUCCESS".equals(event)) {inventoryService.reduceStock(order);shippingService.scheduleDelivery(order);} else if ("SHIPPING_COMPLETE".equals(event)) {notificationService.sendShippingComplete(order.getUser());pointsService.addPoints(order.getUser(), order.getAmount());} else if ("PAYMENT_FAILED".equals(event)) {notificationService.sendPaymentFailed(order.getUser());inventoryService.rollbackStock(order);}}
}
步骤3:定义同事类基类

public abstract class OrderComponent {protected OrderMediator mediator;public OrderComponent(OrderMediator mediator) {this.mediator = mediator;}public void setMediator(OrderMediator mediator) {this.mediator = mediator;}
}
步骤4:实现具体同事类
@Service
public class PaymentService extends OrderComponent {public PaymentService(OrderMediator mediator) {super(mediator);}public void processPayment(Order order) {try {// 支付处理逻辑paymentGateway.charge(order);// 通过中介者通知其他服务mediator.notify(this, "PAYMENT_SUCCESS", order);} catch (PaymentException e) {mediator.notify(this, "PAYMENT_FAILED", order);}}
}@Service
public class ShippingService extends OrderComponent {public ShippingService(OrderMediator mediator) {super(mediator);}public void completeShipping(Order order) {// 发货完成逻辑markAsShipped(order);// 通过中介者通知其他服务mediator.notify(this, "SHIPPING_COMPLETE", order);}
}
步骤5:在控制器中使用
@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate PaymentService paymentService;@Autowiredprivate ShippingService shippingService;@PostMapping("/{orderId}/pay")public ResponseEntity<?> payOrder(@PathVariable String orderId) {Order order = orderService.getOrder(orderId);paymentService.processPayment(order);return ResponseEntity.ok("支付处理中");}@PostMapping("/{orderId}/ship")public ResponseEntity<?> shipOrder(@PathVariable String orderId) {Order order = orderService.getOrder(orderId);shippingService.completeShipping(order);return ResponseEntity.ok("发货完成");}
}

三、中介者模式在Spring Boot中的高级应用

3.1 微服务通信协调

场景:在微服务架构中协调多个服务

@RestController
public class ServiceMediatorController {@Autowiredprivate ServiceMediator mediator;@PostMapping("/event")public void handleEvent(@RequestBody ServiceEvent event) {mediator.notify(event.getSource(), event.getType(), event.getData());}
}@Component
public class ServiceMediator {private final Map<String, ServiceHandler> handlers = new ConcurrentHashMap<>();public void registerHandler(String eventType, ServiceHandler handler) {handlers.put(eventType, handler);}public void notify(String source, String eventType, Object data) {ServiceHandler handler = handlers.get(eventType);if (handler != null) {handler.handle(source, data);}}
}// 注册处理器
@Configuration
public class MediatorConfig {@Autowiredprivate ServiceMediator mediator;@PostConstructpublic void init() {mediator.registerHandler("USER_CREATED", (source, data) -> {// 用户创建事件处理notificationService.sendWelcomeEmail((User) data);pointsService.grantSignupPoints((User) data);});mediator.registerHandler("ORDER_CANCELLED", (source, data) -> {// 订单取消事件处理inventoryService.restockItems((Order) data);paymentService.refundPayment((Order) data);});}
}

3.2 分布式事务协调

场景:跨服务的事务协调

@Component
public class TransactionMediator {@Autowiredprivate OrderService orderService;@Autowiredprivate InventoryService inventoryService;@Autowiredprivate PaymentService paymentService;@Transactionalpublic void processOrder(Order order) {// 开始事务TransactionStatus status = transactionManager.getTransaction(null);try {// 协调多个服务orderService.createOrder(order);inventoryService.reduceStock(order);paymentService.processPayment(order);// 提交事务transactionManager.commit(status);} catch (Exception e) {// 回滚事务transactionManager.rollback(status);mediator.notify(this, "TRANSACTION_FAILED", order);throw e;}}
}

3.3 UI组件交互

场景:前端复杂表单组件交互

// 注册表单中介者
@Component
public class RegistrationFormMediator {private final Map<String, FormComponent> components = new HashMap<>();public void registerComponent(String id, FormComponent component) {components.put(id, component);}public void notify(String sourceId, String event) {if ("usernameField.change".equals(event)) {// 用户名变更时检查可用性String username = components.get("usernameField").getValue();boolean available = userService.checkUsernameAvailable(username);components.get("usernameHint").setVisible(!available);} else if ("passwordField.change".equals(event)) {// 密码变更时检查强度String password = components.get("passwordField").getValue();int strength = passwordService.checkStrength(password);components.get("strengthIndicator").update(strength);}}
}
// 在Thymeleaf中使用
<div id="registrationForm"><input type="text" id="usernameField" onchange="mediator.notify('usernameField', 'change')"><span id="usernameHint" style="display:none">用户名已存在</span><input type="password" id="passwordField" onchange="mediator.notify('passwordField', 'change')"><div id="strengthIndicator"></div>
</div>

四、中介者模式的优势与适用场景

4.1 五大核心优势

  1. 解耦神器:对象间不直接引用,通过中介者通信

  2. 简化交互:多对多交互变为一对多

  3. 集中控制:交互逻辑集中在中介者

  4. 可扩展性:新增同事类不影响现有系统

  5. 职责清晰:各对象职责单一,中介者负责协调

4.2 六大适用场景

  1. 复杂交互系统:对象间交互复杂、混乱

  2. UI组件协调:表单验证、组件联动

  3. 分布式系统:微服务间协调通信

  4. 工作流引擎:多步骤流程协调

  5. 聊天系统:协调多个用户间消息

  6. 交易系统:协调订单、支付、库存等

五、中介者模式与其他模式对比

5.1 中介者模式 vs 观察者模式

维度

中介者模式

观察者模式

交互方向

双向通信

单向通知

耦合度

同事类与中介者耦合

观察者与主题耦合

控制中心

中介者控制所有交互

无中心控制

适用场景

复杂交互协调

状态变化通知

典型实现

聊天室、交易系统

事件通知、日志系统

5.2 中介者模式 vs 外观模式

维度

中介者模式

外观模式

核心目的

协调对象间交互

简化复杂系统接口

交互对象

同级对象间协调

为客户端提供统一接口

关注点

对象间通信

子系统封装

关系类型

多对多关系

一对多关系

典型场景

组件协调、流程控制

API网关、服务封装

六、Spring Boot中的最佳实践

6.1 中介者工厂模式

@Component
public class MediatorFactory {private final Map<Class<?>, Mediator> mediators = new ConcurrentHashMap<>();@Autowiredpublic MediatorFactory(List<Mediator> mediatorList) {mediatorList.forEach(mediator -> mediators.put(mediator.getClass(), mediator));}public <T extends Mediator> T getMediator(Class<T> mediatorType) {return mediatorType.cast(mediators.get(mediatorType));}
}// 在服务中使用
@Service
public class OrderService {private final OrderMediator mediator;@Autowiredpublic OrderService(MediatorFactory factory) {this.mediator = factory.getMediator(OrderMediator.class);}
}

6.2 中介者与Spring事件结合

// 自定义事件
public class OrderEvent extends ApplicationEvent {private final String eventType;private final Order order;public OrderEvent(Object source, String eventType, Order order) {super(source);this.eventType = eventType;this.order = order;}// getters...
}// 中介者监听事件
@Component
public class OrderEventMediator {private final Map<String, Consumer<Order>> handlers = new ConcurrentHashMap<>();public void registerHandler(String eventType, Consumer<Order> handler) {handlers.put(eventType, handler);}@EventListenerpublic void handleOrderEvent(OrderEvent event) {Consumer<Order> handler = handlers.get(event.getEventType());if (handler != null) {handler.accept(event.getOrder());}}
}// 注册处理器
@Configuration
public class OrderMediatorConfig {@Autowiredprivate OrderEventMediator mediator;@Autowiredprivate InventoryService inventoryService;@PostConstructpublic void init() {mediator.registerHandler("PAYMENT_SUCCESS", order -> {inventoryService.reduceStock(order);// 其他处理...});}
}

6.3 中介者模式中的异常处理

@Component
public class ErrorHandlingMediator implements OrderMediator {private final OrderMediator delegate;private final ErrorHandler errorHandler;public ErrorHandlingMediator(OrderMediator delegate, ErrorHandler errorHandler) {this.delegate = delegate;this.errorHandler = errorHandler;}@Overridepublic void notify(Object sender, String event, Order order) {try {delegate.notify(sender, event, order);} catch (Exception e) {errorHandler.handle(e, sender, event, order);}}
}// 统一错误处理
@Component
public class DefaultErrorHandler implements ErrorHandler {@Overridepublic void handle(Exception ex, Object sender, String event, Order order) {// 记录错误日志log.error("中介者处理事件失败: sender={}, event={}, order={}", sender.getClass().getSimpleName(), event, order.getId(), ex);// 发送警报alertService.sendAlert("中介者错误", ex.getMessage());// 回滚操作if ("PAYMENT_SUCCESS".equals(event)) {inventoryService.rollbackStock(order);}}
}

七、中介者模式的局限与解决方案

7.1 常见问题及对策

问题

解决方案

中介者过于复杂

拆分子中介者,使用组合模式

性能瓶颈

异步处理、批量操作

单点故障

中介者集群化部署

扩展困难

使用插件机制动态注册处理器

调试困难

添加详细日志和跟踪ID

7.2 何时避免使用中介者模式

  1. 对象间交互简单直接

  2. 系统规模小,对象数量少

  3. 交互逻辑稳定不变

  4. 性能要求极高的场景(中介者可能有性能开销)

八、总结:中介者模式的架构价值

在Spring Boot开发中,中介者模式带来三大核心价值:

1. 解耦革命:对象间不再直接依赖

图片

2. 逻辑集中:交互规则统一管理

3. 灵活扩展:新增交互不影响现有代码

优秀架构的本质不是消除复杂性,而是管理复杂性!

中介者模式正是这种理念的完美体现,它让我们能够:

  • 将混乱的网状依赖变为清晰的星型结构

  • 集中管理业务规则和交互逻辑

  • 轻松应对业务变化和扩展需求

行动建议:当你的系统中出现以下信号时,考虑引入中介者模式:

  • 对象间交互复杂,关系混乱

  • 修改一个对象会影响多个其他对象

  • 对象间通信逻辑分散在各处

  • 添加新功能需要修改多个类

掌握中介者模式,让你的系统从"蜘蛛网"进化为"高速公路",实现真正的优雅架构!

架构设计之道在于在不同的场景采用合适的架构设计,架构设计没有完美,只有合适。

在代码的路上,我们一起砥砺前行。用代码改变世界!

如果有其它问题,欢迎评论区沟通。

感谢观看,如果觉得对您有用,还请动动您那发财的手指头,点赞、转发、在看、收藏。

高并发解决方案与架构设计。

海量数据存储和性能优化。

通用框架/组件设计与封装。

如何设计合适的技术架构?

如何成功转型架构设计与技术管理?

在竞争激烈的大环境下,只有不断提升核心竞争力才能立于不败之地。

http://www.dtcms.com/a/272476.html

相关文章:

  • JAVA JVM的内存区域划分
  • Redis的常用命令及`SETNX`实现分布式锁、幂等操作
  • Redis Stack扩展功能
  • K8S数据流核心底层逻辑剖析
  • AI进化论06:连接主义的复兴——神经网络的“蛰伏”与“萌动”
  • k8s集群--证书延期
  • 项目进度管控依赖Excel,如何提升数字化能力
  • 调度器与闲逛进程详解,(操作系统OS)
  • UI前端与数字孪生结合案例分享:智慧城市的智慧能源管理系统
  • 数据结构笔记10:排序算法
  • Windows 本地 使用mkcert 配置HTTPS 自签名证书
  • Java并发 - 阻塞队列详解
  • XSS(ctfshow)
  • 文心大模型4.5开源测评:保姆级部署教程+多维度测试验证
  • 图书管理系统(完结版)
  • PyCharm 中 Python 解释器的添加选项及作用
  • 创始人IP如何进阶?三次关键突破实现高效转化
  • QT解析文本框数据——详解
  • pycharm中自动补全方法返回变量
  • 自动化脚本配置网络IP、主机名、网段
  • React封装过哪些组件-下拉选择器和弹窗表单
  • 常用的.gitconfig 配置
  • 【显示模块】嵌入式显示与触摸屏技术理论
  • HarmonyOS AI辅助编程工具(CodeGenie)UI生成
  • 时序数据库的存储之道:从数据特性看技术要点
  • 使用深度学习框架yolov8训练监控视角下非机动车电动车头盔佩戴检测数据集VOC+YOLO格式11999张4类别步骤和流程
  • UEditor 对接 秀米 手机编辑器流程与问题
  • ClickHouse 查看正在执行的SQL查询
  • Django--01基本请求与响应流程
  • go go go 出发咯 - go web开发入门系列(四) 数据库ORM框架集成与解读