设计模式20-中介者模式:多对象通信的集中调度
2026/9/13 23:02:21 网站建设 项目流程

中介者模式:把网状通信改成星型通信

聊天室、机场调度、下单流程、微服务编排,都存在大量对象互相通信的问题。中介者模式把复杂交互集中到一个协调者。

一、痛点:对象之间互相依赖,通信关系成了蜘蛛网

一个电商订单流程中,库存、支付、物流、积分、通知五个模块需要互相配合。如果模块之间直接调用,依赖关系会变成一张网:

库存 <-> 支付 支付 <-> 物流 物流 <-> 积分 积分 <-> 通知 库存 <-> 物流 ...

每新增一个模块,就可能和所有旧模块产生新连接。系统越到后期越难改动。

中介者模式的回答:模块之间不再直接通信,而是统一把消息发给中介者,由中介者集中编排

二、实现:中介者接口 → 具体中介者 → 同事对象

第一步:定义同事对象

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

三、中介者与观察者的区别

维度中介者观察者
交互方向集中式协调,中心知道完整流程广播式通知,被观察者不知道订阅者
耦合点同事对象只依赖中介者观察者只依赖事件/主题
适用场景多个对象需要有序协作一对多通知、结果无需编排

一句话:中介者管“接下来谁来干”,观察者管“大家各自知道一下”

四、工程化提醒

  1. 中介者容易变成上帝对象:所有流程都堆进中介者,最终它比原来的耦合更难维护。应控制中介者只做编排,不承接具体业务;
  2. 合适粒度很重要:跨模块流程可以建中介者,模块内部直接调用通常更简单;
  3. 与消息队列的关系:异步场景中,消息队列是中介者模式的分布式延伸。

小结

中介者模式一句话:别让大家互相打电话,都打到总机。它把多对多通信收敛为多对一通信,让交互顺序集中可见,也让参与者彼此解耦。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询