中介者模式是一种行为设计模式,它用一个中介对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
// 中介者接口
class ChatRoomMediator {
sendMessage(message, user) {
throw new Error('Method not implemented');
}
addUser(user) {
throw new Error('Method not implemented');
}
}
// 具体中介者
class ChatRoom extends ChatRoomMediator {
#users = new Set();
addUser(user) {
this.#users.add(user);
console.log(`${user.name} joined the chat room.`);
}
sendMessage(message, sender) {
for (const user of this.#users) {
if (user !== sender) {
user.receive(message, sender);
}
}
}
}
// 用户(同事)基类
class User {
#name;
#chatRoom;
constructor(name, chatRoom) {
this.#name = name;
this.#chatRoom = chatRoom;
this.#chatRoom.addUser(this);
}
send(message) {
console.log(`${this.#name} sends: ${message}`);
this.#chatRoom.sendMessage(message, this);
}
receive(message, sender) {
console.log(`${this.#name} received from ${sender.name}: ${message}`);
}
get name() {
return this.#name;
}
}
// 具体用户类
class RegularUser extends User {
constructor(name, chatRoom) {
super(name, chatRoom);
}
}
class PremiumUser extends User {
constructor(name, chatRoom) {
super(name, chatRoom);
}
sendPriorityMessage(message) {
console.log(`${this.name} sends priority message: ${message}`);
this.send(`[PRIORITY] ${message}`);
}
}
// 使用示例
function demonstrateMediator() {
const chatRoom = new ChatRoom();
const user1 = new RegularUser("Alice", chatRoom);
const user2 = new RegularUser("Bob", chatRoom);
const user3 = new PremiumUser("Charlie", chatRoom);
user1.send("Hello everyone!");
user2.send("Hi Alice!");
user3.sendPriorityMessage("Important announcement!");
}
demonstrateMediator();
实现思路
-
ChatRoomMediator接口:- 定义了中介者应该实现的方法,如
sendMessage和addUser。
- 定义了中介者应该实现的方法,如
-
ChatRoom类(具体中介者):- 实现了
ChatRoomMediator接口。 - 使用私有字段
#users(Set)来存储聊天室中的用户。 - 实现了
addUser和sendMessage方法来管理用户和消息传递。
- 实现了
-
User类(抽象同事类):- 包含了用户的基本属性和方法。
- 持有对中介者(聊天室)的引用。
- 实现了
send和receive方法。
-
RegularUser和PremiumUser类(具体同事类):- 继承自
User类。 PremiumUser添加了额外的sendPriorityMessage方法。
- 继承自
优点
- 降低耦合性:对象之间不直接通信,而是通过中介者交互。
- 集中控制:将复杂的交互逻辑集中在中介者中。
- 简化对象协议:对象间的交互被简化为与中介者的交互。
- 可扩展性:可以方便地添加新的同事类而不影响现有代码。