行为型模式-中介者模式

发布时间 2023-11-14 21:16:45作者: Qt小罗

1 什么是中介者模式

中介模式是一种行为型设计模式,用于将对象之间的通信封装到一个中介者对象中,以减少对象之间的直接依赖和耦合度。通常情况下,一个系统中的对象需要和其他对象进行通信,如果直接依赖其他对象,会导致系统的可扩展性和可维护性变差。而中介模式使用中介者对象作为协调者,将对象之间的通信通过中介者进行处理,从而避免了对象之间的直接通信。

中介模式的关键角色包括:

  • Mediator(中介者):定义了一个接口用于与各个同事对象进行通信,并提供了一个发送消息的方法。
  • ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象之间的通信。通常会持有一个同事对象的集合,并负责将接收到的消息转发给其他同事对象。
  • Colleague(同事):定义了一些公共方法,并维护了一个中介者的引用。
  • ConcreteColleague(具体同事):实现同事接口,并实现自己的业务逻辑。在需要与其他同事通信时,通过中介者对象发送消息。

2 举个例子

下面以一个聊天室的例子来说明中介模式的用法。假设有一个简单的聊天室,其中有多个用户可以相互发送消息。

#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) : name(name) {}

    void setMediator(ChatRoomMediator* mediator) {
        this->mediator = mediator;
    }

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

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

// 具体中介者
class ChatRoomMediatorImpl : public ChatRoomMediator {
private:
    std::vector<User*> users;

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

    virtual void sendMessage(const std::string& message, User* user) override {
        for (auto u : users) {
            if (u != user) {
                u->receiveMessage(message);
            }
        }
    }
};

int main() {
    ChatRoomMediatorImpl chatRoom;
    User user1("User1");
    User user2("User2");
    User user3("User3");

    user1.setMediator(&chatRoom);
    user2.setMediator(&chatRoom);
    user3.setMediator(&chatRoom);

    chatRoom.addUser(&user1);
    chatRoom.addUser(&user2);
    chatRoom.addUser(&user3);

    user1.sendMessage("Hello, everyone!");
    user2.sendMessage("Hi, User1!");

    return 0;
}

在上述示例中,ChatRoomMediator 是中介者接口,User 是同事类。ChatRoomMediatorImpl 是具体中介者,负责管理用户并将消息转发给其他用户。当用户发送消息时,它们会通过中介者发送消息,由中介者将消息转发给其他用户。

当用户发送消息时,消息会包含发送者的用户名,最终在聊天室中的其他用户将收到该消息。通过使用中介者模式,用户之间不需要直接依赖彼此,而是通过中介者进行通信,实现了解耦。这样,当需要扩展聊天室并添加更多的用户时,只需将用户添加到中介者中即可,而不需要修改用户类的代码。

3 总结

中介者模式通过引入一个中心化的中介对象,来将一组对象之间的复杂交互转化为与中介对象的简单通信,从而解耦对象之间的依赖关系。