文章目录
- 前言
- 一、概念
- 二、核心结构
- 三、Java 代码实现(聊天室场景)
- 1. 抽象中介者
- 2. 抽象同事类(User)
- 3. 具体中介者(聊天室)
- 4. 具体同事(普通用户)
- 5. 客户端
- 四、核心变化
- 五、优缺点
- 优点
- 缺点
- 六、应用场景
- 七、总结
前言
当一个系统中对象之间交互非常多、互相依赖错综复杂时,会形成一张“蜘蛛网”结构:A依赖B、B依赖C、C依赖A、D依赖所有人……这种网状耦合会让代码极难维护、扩展、调试。中介者模式就是用来把网状结构变成星型结构,让所有对象只和中介者通信,大幅降低耦合。
一、概念
中介者模式(Mediator Pattern)是一种行为型设计模式,核心思想:
用一个中介对象封装一系列对象之间的交互,使各个对象不需要显式相互引用,从而降低耦合,并且可以独立改变它们之间的交互。
简单理解:
- 把多对多 → 变成一对多
- 所有组件只认识中介者,不认识彼此
- 交互逻辑全部集中在中介者里
一句话总结:
取消网状依赖,统一由中介者调度。
二、核心结构
- Mediator(抽象中介者)
定义同事对象通信接口。 - ConcreteMediator(具体中介者)
协调各同事,维护所有同事引用,处理交互逻辑。 - Colleague(抽象同事)
持有中介者引用。 - ConcreteColleague(具体同事)
只和中介者通信,不直接交互。
三、Java 代码实现(聊天室场景)
场景:用户在聊天室发消息,不直接私聊对方,而是发给聊天室(中介者),由中介者转发。
1. 抽象中介者
publicinterfaceChatMediator{voidsendMessage(Stringmsg,Useruser);voidaddUser(Useruser);}2. 抽象同事类(User)
publicabstractclassUser{protectedChatMediatormediator;protectedStringname;publicUser(ChatMediatormediator,Stringname){this.mediator=mediator;this.name=name;}publicabstractvoidsend(Stringmsg);publicabstractvoidreceive(Stringmsg);}3. 具体中介者(聊天室)
importjava.util.ArrayList;importjava.util.List;publicclassChatRoomimplementsChatMediator{privateList<User>users=newArrayList<>();@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){ChatMediatorroom=newChatRoom();Useralice=newChatUser(room,"Alice");Userbob=newChatUser(room,"Bob");Usertom=newChatUser(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
- 最适合:多对象复杂交互场景