多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

设计模式20-中介者模式:多对象通信的集中调度

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