文章目录
- 前言
- 一、概念
- 二、核心结构
- [三、Java 代码实现(聊天室场景)](#三、Java 代码实现(聊天室场景))
-
- [1. 抽象中介者](#1. 抽象中介者)
- [2. 抽象同事类(User)](#2. 抽象同事类(User))
- [3. 具体中介者(聊天室)](#3. 具体中介者(聊天室))
- [4. 具体同事(普通用户)](#4. 具体同事(普通用户))
- [5. 客户端](#5. 客户端)
- 四、核心变化
- 五、优缺点
- 六、应用场景
- 七、总结
前言
当一个系统中对象之间交互非常多、互相依赖错综复杂 时,会形成一张"蜘蛛网"结构:A依赖B、B依赖C、C依赖A、D依赖所有人......这种网状耦合 会让代码极难维护、扩展、调试。中介者模式 就是用来把网状结构变成星型结构,让所有对象只和中介者通信,大幅降低耦合。
一、概念
中介者模式(Mediator Pattern) 是一种行为型设计模式 ,核心思想:
用一个中介对象封装一系列对象之间的交互,使各个对象不需要显式相互引用,从而降低耦合,并且可以独立改变它们之间的交互。
简单理解:
- 把多对多 → 变成一对多
- 所有组件只认识中介者,不认识彼此
- 交互逻辑全部集中在中介者里
一句话总结:
取消网状依赖,统一由中介者调度。
二、核心结构
- Mediator(抽象中介者)
定义同事对象通信接口。 - ConcreteMediator(具体中介者)
协调各同事,维护所有同事引用,处理交互逻辑。 - Colleague(抽象同事)
持有中介者引用。 - ConcreteColleague(具体同事)
只和中介者通信,不直接交互。
三、Java 代码实现(聊天室场景)
场景:用户在聊天室发消息,不直接私聊对方 ,而是发给聊天室(中介者),由中介者转发。
1. 抽象中介者
java
public interface ChatMediator {
void sendMessage(String msg, User user);
void addUser(User user);
}
2. 抽象同事类(User)
java
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
3. 具体中介者(聊天室)
java
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements ChatMediator {
private List<User> users = new ArrayList<>();
@Override
public void addUser(User user) {
users.add(user);
}
@Override
public void sendMessage(String msg, User sender) {
for (User u : users) {
// 不发给自己
if (u != sender) {
u.receive(sender.name + ": " + msg);
}
}
}
}
4. 具体同事(普通用户)
java
public class ChatUser extends User {
public ChatUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String msg) {
System.out.println(name + " 发送: " + msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(name + " 收到: " + msg);
}
}
5. 客户端
java
public class Client {
public static void main(String[] args) {
ChatMediator room = new ChatRoom();
User alice = new ChatUser(room, "Alice");
User bob = new ChatUser(room, "Bob");
User tom = new ChatUser(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
- 最适合:多对象复杂交互场景