【设计模式】行为型-中介者模式

张开发
2026/4/20 6:09:50 15 分钟阅读

分享文章

【设计模式】行为型-中介者模式
文章目录前言一、概念二、核心结构三、Java 代码实现聊天室场景1. 抽象中介者2. 抽象同事类User3. 具体中介者聊天室4. 具体同事普通用户5. 客户端四、核心变化五、优缺点优点缺点六、应用场景七、总结前言当一个系统中对象之间交互非常多、互相依赖错综复杂时会形成一张“蜘蛛网”结构A依赖B、B依赖C、C依赖A、D依赖所有人……这种网状耦合会让代码极难维护、扩展、调试。中介者模式就是用来把网状结构变成星型结构让所有对象只和中介者通信大幅降低耦合。一、概念中介者模式Mediator Pattern是一种行为型设计模式核心思想用一个中介对象封装一系列对象之间的交互使各个对象不需要显式相互引用从而降低耦合并且可以独立改变它们之间的交互。简单理解把多对多 → 变成一对多所有组件只认识中介者不认识彼此交互逻辑全部集中在中介者里一句话总结取消网状依赖统一由中介者调度。二、核心结构Mediator抽象中介者定义同事对象通信接口。ConcreteMediator具体中介者协调各同事维护所有同事引用处理交互逻辑。Colleague抽象同事持有中介者引用。ConcreteColleague具体同事只和中介者通信不直接交互。三、Java 代码实现聊天室场景场景用户在聊天室发消息不直接私聊对方而是发给聊天室中介者由中介者转发。1. 抽象中介者publicinterfaceChatMediator{voidsendMessage(Stringmsg,Useruser);voidaddUser(Useruser);}2. 抽象同事类UserpublicabstractclassUser{protectedChatMediatormediator;protectedStringname;publicUser(ChatMediatormediator,Stringname){this.mediatormediator;this.namename;}publicabstractvoidsend(Stringmsg);publicabstractvoidreceive(Stringmsg);}3. 具体中介者聊天室importjava.util.ArrayList;importjava.util.List;publicclassChatRoomimplementsChatMediator{privateListUserusersnewArrayList();OverridepublicvoidaddUser(Useruser){users.add(user);}OverridepublicvoidsendMessage(Stringmsg,Usersender){for(Useru:users){// 不发给自己if(u!sender){u.receive(sender.name: msg);}}}}4. 具体同事普通用户publicclassChatUserextendsUser{publicChatUser(ChatMediatormediator,Stringname){super(mediator,name);}Overridepublicvoidsend(Stringmsg){System.out.println(name 发送: msg);mediator.sendMessage(msg,this);}Overridepublicvoidreceive(Stringmsg){System.out.println(name 收到: msg);}}5. 客户端publicclassClient{publicstaticvoidmain(String[]args){ChatMediatorroomnewChatRoom();UseralicenewChatUser(room,Alice);UserbobnewChatUser(room,Bob);UsertomnewChatUser(room,Tom);room.addUser(alice);room.addUser(bob);room.addUser(tom);alice.send(大家好);}}输出Alice 发送: 大家好 Bob 收到: Alice: 大家好 Tom 收到: Alice: 大家好四、核心变化网状耦合烂代码A ↔ B ↔ C ↔ D 互相引用星型结构中介者优化A、B、C、D → 只 ↔ Mediator五、优缺点优点彻底简化多对多依赖集中控制交互逻辑便于维护各组件解耦可独立复用符合单一职责缺点中介者可能过于庞大变成“上帝类”复杂度转移到中介者六、应用场景聊天室、群聊系统GUI 组件交互按钮、输入框、表单调度中心、网关、控制器飞机调度塔、交通信号灯分布式事务协调器经典源码Spring MVC DispatcherServlet核心中介者Java AWT/Swing 事件机制Netty EventLoop七、总结中介者模式 网状依赖 → 星型调度核心所有交互统一由中介者转发结构Mediator Colleague最适合多对象复杂交互场景

更多文章