设计模式---中介者模式

101 阅读2分钟

定义

中介者模式(Mediator Pattern)是一种行为型设计模式,用于定义一个中介对象来封装一组对象之间的交互。通过中介者模式,对象之间的交互不再直接发生,而是通过中介者来协调和管理。这减少了对象之间的耦合,使得对象之间的关系更加松散

结构

  • Mediator(中介者) : 定义中介者的接口,通常包含一个方法来通知中介者各个对象的变化。

  • ConcreteMediator(具体中介者) : 实现Mediator接口,负责协调和管理各个同事对象之间的交互。

  • Colleague(同事类) : 各个参与交互的对象,每个同事对象都持有一个中介者的引用,通过中介者来进行交互。

  • ConcreteColleague(具体同事类) : 实现Colleague接口,利用中介者与其他同事对象进行交互。

代码示例

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

// 中介者接口
class Mediator 
{
public:
    virtual void send(const std::string& message, class Colleague* sender) = 0;
};

// 同事类
class Colleague 
{
protected:
    Mediator* mediator;

public:
    Colleague(Mediator* mediator) : mediator(mediator) {}

    virtual void receive(const std::string& message) = 0;
    void send(const std::string& message) 
    {
        mediator->send(message, this);
    }
};

// 具体同事类 - 用户
class User : public Colleague 
{
    std::string name;

public:
    User(const std::string& name, Mediator* mediator) : Colleague(mediator), name(name) {}

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

// 具体中介者 - 聊天室
class ChatRoom : public Mediator 
{
    std::vector<Colleague*> users;

public:
    void addUser(Colleague* user) 
    {
        users.push_back(user);
    }

    void send(const std::string& message, Colleague* sender) override 
    {
        for (auto user : users) 
        {
            if (user != sender) 
            {
                user->receive(message);
            }
        }
    }
};

int main() {
    // 创建中介者
    ChatRoom chatRoom;

    // 创建用户
    User user1("Alice", &chatRoom);
    User user2("Bob", &chatRoom);
    User user3("Charlie", &chatRoom);

    // 添加用户到聊天室
    chatRoom.addUser(&user1);
    chatRoom.addUser(&user2);
    chatRoom.addUser(&user3);

    // 用户发送消息
    user1.send("Hello everyone!");
    user2.send("Hi Alice!");

    system("pause");
    return 0;
}
  • Mediator 是中介者接口,定义了 send 方法来转发消息。

  • Colleague 是同事类基类,定义了与中介者交互的接口,包括 receivesend 方法。

  • User 是具体的同事类,代表聊天室中的用户,能够发送和接收消息。

  • ChatRoom 是具体的中介者,实现了消息转发的逻辑。它维护了用户列表,并将消息从发送者转发给其他用户。

  • main 函数中,创建了一个聊天室和几个用户,并模拟用户发送消息。