什么是中介者模式?JavaScript 实现一个中介者模式的示例
·
什么是中介者模式?
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象,封装多个对象(同事)之间的交互关系,使同事对象无需直接相互引用,而是通过中介者间接通信。
其核心思想是:将多对象间的 “网状交互” 转化为 “星状交互”(所有对象都与中介者交互),降低对象间的耦合度,使系统更易于维护和扩展。
中介者模式的核心角色
- 中介者(Mediator):定义统一的接口,用于协调同事对象之间的交互,持有所有同事的引用。
- 同事(Colleague):相互交互的对象,每个同事都知道中介者的存在,通过中介者与其他同事通信,而不直接引用其他同事。
JavaScript 实现中介者模式示例:聊天室
以下以 “聊天室” 为例,实现中介者模式。场景是:多个用户(同事)在聊天室中发送消息,用户之间不直接通信,而是通过聊天室(中介者)转发消息,中介者负责将消息广播给所有其他用户。
代码实现
// -------------- 1. 中介者(Mediator):聊天室 --------------
class ChatRoom {
constructor() {
this.users = {}; // 存储所有用户(键:用户名,值:用户对象)
}
// 注册用户(添加同事到中介者)
register(user) {
this.users[user.name] = user;
// 绑定用户发送消息时的回调:通过中介者转发
user.setMediator(this);
}
// 转发消息(中介者的核心逻辑)
sendMessage(senderName, message) {
// 遍历所有用户,排除发送者,转发消息
Object.values(this.users).forEach(user => {
if (user.name !== senderName) {
user.receive(senderName, message);
}
});
}
}
// -------------- 2. 同事(Colleague):用户 --------------
class User {
constructor(name) {
this.name = name;
this.mediator = null; // 持有中介者引用
}
// 设置中介者
setMediator(mediator) {
this.mediator = mediator;
}
// 发送消息(通过中介者)
send(message) {
console.log(`${this.name} 发送消息:${message}`);
this.mediator.sendMessage(this.name, message); // 不直接调用其他用户,委托中介者
}
// 接收消息(由中介者触发)
receive(senderName, message) {
console.log(`${this.name} 收到 ${senderName} 的消息:${message}`);
}
}
// -------------- 3. 客户端使用 --------------
// 创建中介者(聊天室)
const chatRoom = new ChatRoom();
// 创建同事(用户)
const alice = new User("Alice");
const bob = new User("Bob");
const charlie = new User("Charlie");
// 注册用户到聊天室(中介者管理同事)
chatRoom.register(alice);
chatRoom.register(bob);
chatRoom.register(charlie);
// 用户发送消息(通过中介者转发)
console.log("=== Alice 发送消息 ===");
alice.send("大家好!我是 Alice~");
// 输出:
// Alice 发送消息:大家好!我是 Alice~
// Bob 收到 Alice 的消息:大家好!我是 Alice~
// Charlie 收到 Alice 的消息:大家好!我是 Alice~
console.log("\n=== Bob 发送消息 ===");
bob.send("欢迎加入!");
// 输出:
// Bob 发送消息:欢迎加入!
// Alice 收到 Bob 的消息:欢迎加入!
// Charlie 收到 Bob 的消息:欢迎加入!
console.log("\n=== Charlie 发送消息 ===");
charlie.send("很高兴认识大家!");
// 输出:
// Charlie 发送消息:很高兴认识大家!
// Alice 收到 Charlie 的消息:很高兴认识大家!
// Bob 收到 Charlie 的消息:很高兴认识大家!
代码说明
-
中介者(ChatRoom):
- 通过
register方法管理所有用户(同事),存储用户的引用。 - 核心方法
sendMessage负责转发消息:接收发送者姓名和消息后,遍历所有用户,将消息转发给除发送者外的其他用户,实现 “广播” 逻辑。
- 通过
-
同事(User):
- 每个用户持有
mediator引用(通过setMediator绑定),但不知道其他用户的存在。 - 发送消息时,调用
this.mediator.sendMessage(...),委托中介者处理,而非直接调用其他用户的receive方法。 - 接收消息的
receive方法由中介者触发,只需处理消息展示,无需关心消息来源的具体逻辑。
- 每个用户持有
-
核心优势:
- 解耦同事关系:用户之间无需相互引用(避免了
alice.sendTo(bob, message)这样的直接调用),所有交互通过中介者完成,降低了耦合度。 - 集中管理交互:聊天室的消息转发逻辑集中在中介者中,修改交互规则(如仅转发给指定用户)只需修改中介者,无需修改每个用户。
- 简化扩展:新增用户(如
Dave)只需注册到中介者,无需修改现有用户代码;新增功能(如消息过滤)只需在中介者中添加逻辑。
- 解耦同事关系:用户之间无需相互引用(避免了
中介者模式的常见应用场景
- 通信系统:如聊天室、即时通讯工具(所有用户通过服务器中介通信)。
- GUI 组件交互:如表单中的多个输入框联动(如 “密码” 与 “确认密码” 校验,通过表单中介协调)。
- 微服务注册中心:服务之间不直接通信,而是通过注册中心(中介者)发现和调用服务。
- 游戏场景:如多人游戏中,玩家的动作(移动、攻击)通过游戏服务器(中介者)同步给其他玩家。
注意事项
- 中介者膨胀风险:所有交互逻辑集中在中介者中,可能导致中介者变得庞大复杂(称为 “中介者反模式”),需注意拆分职责。
- 过度依赖中介者:同事对象完全依赖中介者通信,若中介者故障,整个系统可能瘫痪,需确保中介者的可靠性。
中介者模式的核心是 “集中交互,减少耦合”,通过引入中介者将多对象间的复杂关系简化,使系统更清晰、更易于维护,尤其适合处理多对象交互频繁的场景。
更多推荐


所有评论(0)