中介者模式(附C++代码示例)

中介者模式是一种设计模式,通过引入中介对象简化对象间复杂通信。文章详细阐述了其核心思想、使用场景、注意事项,并提供了聊天室系统的代码示例,展示了如何通过中介者实现用户消息传递的协调。
摘要由CSDN通过智能技术生成

中介者模式的含义

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介对象来简化多个对象间的复杂通信和控制逻辑。中介者模式中的中介者承担了组件间交互的协调职责,使得各个组件无需直接通信。

核心思想及解释

中介者模式的核心思想是通过一个中介对象封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,可以独立地改变它们之间的交互。中介者承担了协调多个对象间复杂交互的职责,对象只需知道中介者而无需知道其他同事对象。

为什么要使用中介者模式

  1. 降低类之间的耦合度:通过将对象之间的交互封装到中介者中,各个对象无需知道对方的实现细节。
  2. 集中控制交互逻辑:交互的管理和协调被集中到一个中介者对象中,使得系统易于理解和维护。
  3. 更易于修改和扩展交互:中介者将系统中对象间的通信封装起来,增加新的中介者或修改现有中介者都较为方便,不需要修改实际对象。

使用中介者模式需要注意的点

  1. 中介者的复杂性:随着系统的扩展,中介者可能会变得非常复杂,聚集过多的逻辑。
  2. 过度集中化:如果过多地使用中介者,可能导致中介者成为一个超级对象,难以维护。
  3. 性能问题:所有的对象间交互都需要经过中介者,可能会引入性能瓶颈。

工程的应用场景

  1. 用户界面中的组件通信:例如,MVC 架构中,控制器作为中介者,协调视图和模型之间的交互。
  2. 聊天室:聊天室服务器作为中介者,管理用户之间的消息传递。
  3. 航空交通控制系统:控制塔作为中介者,协调多架飞机的起降和空中交通。

示例代码及解释

假设我们正在开发一个简单的聊天室系统,其中ChatRoom充当中介者的角色,协调用户之间的消息传递。

定义中介者接口和具体中介者:

#include <iostream>
#include <string>
#include <map>

class User;

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

// 具体中介者
class ChatRoom : public ChatMediator 
{
    std::map<std::string, User*> users;

public:
    void addUser(User* user) override;
    void sendMessage(const std::string& message, User* user) override;
};

// 同事类
class User 
{
    std::string name;
    ChatMediator* mediator;

public:
    User(const std::string& name, ChatMediator* med) : name(name), mediator(med) 
    {
        mediator->addUser(this);
    }
    void send(const std::string& message) 
    {
        std::cout << this->name << " sends: " << message << std::endl;
        mediator->sendMessage(message, this);
    }
    void receive(const std::string& message) 
    {
        std::cout << this->name << " receives: " << message << std::endl;
    }
    std::string getName() const { return name; }
};

void ChatRoom::addUser(User* user) 
{
    users[user->getName()] = user;
}

void ChatRoom::sendMessage(const std::string& message, User* user) 
{
    for (auto u : users) 
    {
        if (u.second != user) 
        { // do not send message to self
            u.second->receive(message);
        }
    }
}

客户端代码:

int main() 
{
    ChatRoom room;
    User user1("Alice", &room);
    User user2("Bob", &room);

    user1.send("Hi Bob!");
    user2.send("Hey Alice!");

    return 0;
}

输出代码运行结果

Alice sends: Hi Bob!
Bob receives: Hi Bob!
Bob sends: Hey Alice!
Alice receives: Hey Alice!

这个示例演示了中介者模式在聊天室应用中的使用。ChatRoom类作为中介者,负责协调用户之间的消息传递,每当一个用户发送消息时,ChatRoom负责将消息转发给其他所有用户。这样,用户类不直接与其他用户通信,而是通过中介者进行,符合中介者模式的定义。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值