中介者模式(Mediator Pattern)

定义

中介者模式(Mediator Pattern)是一种行为设计模式,它用于将一组对象的交互行为封装在一个中介者对象中,从而减少对象之间的直接耦合。这种模式提供了一种集中式的控制方式,通过中介者对象来协调不同对象之间的交互。

示例

以下是一个简单的 C++ 中介者模式的示例,我们以聊天室为例,其中用户(User)之间的消息传递通过中介者(ChatRoom)进行协调。

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

class User;

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

// 具体中介者类
class ConcreteChatRoom : public ChatRoom {
public:
    void sendMessage(const std::string& message, User* user) override {
        // 将消息广播给其他用户
        for (User* u : users) {
            if (u != user) {
                u->receiveMessage(message);
            }
        }
    }

    void addUser(User* user) {
        users.push_back(user);
    }

private:
    std::vector<User*> users;
};

// 抽象同事类
class User {
public:
    User(const std::string& name, ChatRoom* chatRoom) : name(name), chatRoom(chatRoom) {
        chatRoom->addUser(this);
    }

    virtual void sendMessage(const std::string& message) {
        chatRoom->sendMessage(name + ": " + message, this);
    }

    virtual void receiveMessage(const std::string& message) {
        std::cout << name << " received: " << message << std::endl;
    }

private:
    std::string name;
    ChatRoom* chatRoom;
};

// 具体同事类
class ConcreteUser : public User {
public:
    ConcreteUser(const std::string& name, ChatRoom* chatRoom) : User(name, chatRoom) {}

    // 具体用户的其他操作...
};

int main() {
    ConcreteChatRoom chatRoom;

    ConcreteUser user1("Alice", &chatRoom);
    ConcreteUser user2("Bob", &chatRoom);
    ConcreteUser user3("Charlie", &chatRoom);

    user1.sendMessage("Hello, everyone!");

    return 0;
}

解释:

  1. 中介者接口和具体中介者类: ChatRoom 是中介者的接口,ConcreteChatRoom 是实现该接口的具体中介者类。中介者负责协调用户之间的通信。

  2. 抽象同事类和具体同事类: User 是抽象同事类,ConcreteUser 是实现该抽象类的具体同事类。每个用户通过中介者发送消息,并接收其他用户的消息。

  3. 用户和中介者的交互: 用户通过中介者发送消息,中介者负责将消息传递给其他用户。这样,用户之间不直接通信,而是通过中介者进行协调,降低了对象之间的耦合性。

  4. 示例运行: 在示例中,Alice 发送消息后,Bob 和 Charlie 都能收到消息,而不需要直接知道消息的发送者是谁。这就是中介者模式的作用。

中介者模式可以在需要解耦多个对象之间的交互关系时发挥作用,使得系统更加灵活可

相关推荐
linx29512 分钟前
第七章 · 标准库容器、算法与 ranges
c语言·开发语言·数据结构·c++·算法
钓鱼的肝17 分钟前
csp-j-s总结(4)
c++·经验分享·笔记·算法
别动我齐刘海39 分钟前
ROS2 Jazzy + C++ 实战路线——基础学习1
c++·vscode·python·ubuntu·机器学习·自动驾驶·github
j7~1 小时前
【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路
linux·c++·网络编程·tcp·报文分割·网络计算器·协议落地
青少儿编程课堂1 小时前
多源最短路与最小环(Floyd 算法图论解析)
c++·python·算法·bfs·信息学竞赛
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode
Severus_black1 小时前
【C++初阶】模板初阶——为何C++能和C语言拉开差距?
c++
艾莉丝努力练剑3 小时前
【AI大模型接入SDK】LLM会话管理模块设计
网络·c++·人工智能·学习·大模型
小此方3 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
GG-_-Bond12 小时前
9.1 kv存储resp协议模拟面试
c++