JavaScript设计模式「基于ES2024」:行为型模式-中介者模式

48 阅读1分钟

中介者模式是一种行为设计模式,它用一个中介对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

// 中介者接口
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();

实现思路

  1. ChatRoomMediator 接口

    • 定义了中介者应该实现的方法,如 sendMessageaddUser
  2. ChatRoom 类(具体中介者)

    • 实现了 ChatRoomMediator 接口。
    • 使用私有字段 #users(Set)来存储聊天室中的用户。
    • 实现了 addUsersendMessage 方法来管理用户和消息传递。
  3. User 类(抽象同事类)

    • 包含了用户的基本属性和方法。
    • 持有对中介者(聊天室)的引用。
    • 实现了 sendreceive 方法。
  4. RegularUserPremiumUser 类(具体同事类)

    • 继承自 User 类。
    • PremiumUser 添加了额外的 sendPriorityMessage 方法。

优点

  • 降低耦合性:对象之间不直接通信,而是通过中介者交互。
  • 集中控制:将复杂的交互逻辑集中在中介者中。
  • 简化对象协议:对象间的交互被简化为与中介者的交互。
  • 可扩展性:可以方便地添加新的同事类而不影响现有代码。