跳转到内容

C++ 中介者模式

来自代码酷

模板:Note

概述[编辑 | 编辑源代码]

中介者模式是一种行为设计模式,旨在通过引入一个中介对象来封装一组对象之间的交互,从而减少对象间的直接耦合。该模式符合迪米特法则(Law of Demeter),即“最少知识原则”,通过集中控制逻辑来简化系统的维护和扩展。

核心思想[编辑 | 编辑源代码]

  • 将多对多的对象交互转化为一对多的交互。
  • 中介者作为协调者,处理对象间的通信。
  • 对象仅需与中介者交互,无需直接引用其他对象。

结构[编辑 | 编辑源代码]

classDiagram class Mediator { +notify(sender: Colleague, event: string): void } class Colleague { -mediator: Mediator +Colleague(mediator: Mediator) +send(event: string): void +receive(event: string): void } class ConcreteMediator { -colleague1: Colleague -colleague2: Colleague +notify(sender: Colleague, event: string): void } class ConcreteColleague1 { +send(event: string): void +receive(event: string): void } class ConcreteColleague2 { +send(event: string): void +receive(event: string): void } Mediator <|-- ConcreteMediator Colleague <|-- ConcreteColleague1 Colleague <|-- ConcreteColleague2 Colleague o-- Mediator ConcreteMediator --> ConcreteColleague1 ConcreteMediator --> ConcreteColleague2

角色说明[编辑 | 编辑源代码]

  • Mediator(抽象中介者):定义通信接口。
  • ConcreteMediator(具体中介者):实现协调逻辑。
  • Colleague(同事类):对象基类,持有中介者引用。
  • ConcreteColleague(具体同事类):实现自身行为,通过中介者传递消息。

C++实现示例[编辑 | 编辑源代码]

以下是一个简单的聊天室系统示例,其中中介者协调用户之间的消息传递:

#include <iostream>
#include <string>
#include <vector>

// 前置声明
class User;

// 抽象中介者
class ChatRoomMediator {
public:
    virtual void sendMessage(const std::string& message, User* user) = 0;
};

// 同事类
class User {
protected:
    ChatRoomMediator* mediator;
    std::string name;
public:
    User(const std::string& name, ChatRoomMediator* mediator) 
        : name(name), mediator(mediator) {}
    virtual void send(const std::string& message) {
        mediator->sendMessage(message, this);
    }
    virtual void receive(const std::string& message) {
        std::cout << name << " received: " << message << std::endl;
    }
};

// 具体中介者
class ConcreteChatRoom : public ChatRoomMediator {
private:
    std::vector<User*> users;
public:
    void addUser(User* user) {
        users.push_back(user);
    }
    void sendMessage(const std::string& message, User* sender) override {
        for (User* user : users) {
            if (user != sender) {
                user->receive(message);
            }
        }
    }
};

// 使用示例
int main() {
    ConcreteChatRoom chatRoom;

    User alice("Alice", &chatRoom);
    User bob("Bob", &chatRoom);
    chatRoom.addUser(&alice);
    chatRoom.addUser(&bob);

    alice.send("Hi Bob!");  // 输出: Bob received: Hi Bob!
    bob.send("Hello Alice!"); // 输出: Alice received: Hello Alice!
}

代码解析[编辑 | 编辑源代码]

1. 用户(`User`)通过中介者(`ConcreteChatRoom`)发送消息。 2. 中介者遍历所有用户(除发送者外)并调用其`receive`方法。 3. 输出显示消息的正确路由。

实际应用场景[编辑 | 编辑源代码]

中介者模式常见于以下场景:

  • GUI组件交互:如对话框中的按钮、输入框通过中介者协调。
  • 游戏开发:角色、道具通过游戏管理器通信。
  • 微服务架构:服务间通过API网关解耦。

案例:飞机塔台调度[编辑 | 编辑源代码]

flowchart TD A[飞机A] -->|请求降落| B(塔台中介者) B -->|分配跑道| C[跑道1] D[飞机B] -->|请求起飞| B B -->|授权起飞| D

优缺点[编辑 | 编辑源代码]

模板:Pros

模板:Cons

进阶主题[编辑 | 编辑源代码]

总结[编辑 | 编辑源代码]

中介者模式通过封装对象交互,提供了一种清晰的解耦方案。在C++中,可通过抽象接口和指针机制灵活实现该模式。开发者应根据系统复杂度权衡是否引入中介者,避免过度设计。