中介者模式:把网状通信改成星型通信
聊天室、机场调度、下单流程、微服务编排,都存在大量对象互相通信的问题。中介者模式把复杂交互集中到一个协调者。
一、痛点:对象之间互相依赖,通信关系成了蜘蛛网
一个电商订单流程中,库存、支付、物流、积分、通知五个模块需要互相配合。如果模块之间直接调用,依赖关系会变成一张网:
库存 <-> 支付 支付 <-> 物流 物流 <-> 积分 积分 <-> 通知 库存 <-> 物流 ...每新增一个模块,就可能和所有旧模块产生新连接。系统越到后期越难改动。
中介者模式的回答:模块之间不再直接通信,而是统一把消息发给中介者,由中介者集中编排。
二、实现:中介者接口 → 具体中介者 → 同事对象
第一步:定义同事对象
publicclassInventoryService{privateOrderMediatormediator;publicvoidsetMediator(OrderMediatormediator){this.mediator=mediator;}publicvoidstockLocked(StringorderId){System.out.println("[库存] 已锁定库存: "+orderId);mediator.afterStockLocked(orderId);}}publicclassPaymentService{privateOrderMediatormediator;publicvoidsetMediator(OrderMediatormediator){this.mediator=mediator;}publicvoidpaymentSuccess(StringorderId){System.out.println("[支付] 支付成功: "+orderId);mediator.afterPayment(orderId);}}publicclassLogisticsService{publicvoidcreateShipment(StringorderId){System.out.println("[物流] 创建物流单: "+orderId);}}第二步:定义中介者接口
publicinterfaceOrderMediator{voidsubmitOrder(StringorderId);voidafterStockLocked(StringorderId);voidafterPayment(StringorderId);}第三步:具体中介者编排交互
publicclassOrderMediatorImplimplementsOrderMediator{privatefinalInventoryServiceinventory;privatefinalPaymentServicepayment;privatefinalLogisticsServicelogistics;publicOrderMediatorImpl(InventoryServiceinventory,PaymentServicepayment,LogisticsServicelogistics){this.inventory=inventory;this.payment=payment;this.logistics=logistics;}@OverridepublicvoidsubmitOrder(StringorderId){inventory.stockLocked(orderId);}@OverridepublicvoidafterStockLocked(StringorderId){payment.paymentSuccess(orderId);}@OverridepublicvoidafterPayment(StringorderId){logistics.createShipment(orderId);}}第四步:组装并运行
InventoryServiceinventory=newInventoryService();PaymentServicepayment=newPaymentService();LogisticsServicelogistics=newLogisticsService();OrderMediatorImplmediator=newOrderMediatorImpl(inventory,payment,logistics);inventory.setMediator(mediator);payment.setMediator(mediator);mediator.submitOrder("ORDER-1001");输出:
[库存] 已锁定库存: ORDER-1001 [支付] 支付成功: ORDER-1001 [物流] 创建物流单: ORDER-1001三、中介者与观察者的区别
| 维度 | 中介者 | 观察者 |
|---|---|---|
| 交互方向 | 集中式协调,中心知道完整流程 | 广播式通知,被观察者不知道订阅者 |
| 耦合点 | 同事对象只依赖中介者 | 观察者只依赖事件/主题 |
| 适用场景 | 多个对象需要有序协作 | 一对多通知、结果无需编排 |
一句话:中介者管“接下来谁来干”,观察者管“大家各自知道一下”。
四、工程化提醒
- 中介者容易变成上帝对象:所有流程都堆进中介者,最终它比原来的耦合更难维护。应控制中介者只做编排,不承接具体业务;
- 合适粒度很重要:跨模块流程可以建中介者,模块内部直接调用通常更简单;
- 与消息队列的关系:异步场景中,消息队列是中介者模式的分布式延伸。
小结
中介者模式一句话:别让大家互相打电话,都打到总机。它把多对多通信收敛为多对一通信,让交互顺序集中可见,也让参与者彼此解耦。