目录

接口隔离_Mediator


接口隔离

在组件构建过程中,某些接口之间直接的依颖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式

  • Facade
  • Proxy
  • Adapter
  • Mediator

1 Mediator

1.1 模式动机

在软件构建过程中,经常会出现多个对象互相关联交互的情况, 对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。

在这种情况工,我们可使用一个"中介对象"来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

1.2 模式定义

用一个中介对象来封装(封装变化)一系列的对象交互。 中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互。

1.3 模式示例代码

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

// 中介者接口:聊天室中介者
class ChatRoomMediator {
public:
    virtual void sendMessage(const std::string& message, const std::string& sender) = 0;
    virtual void addUser(const std::string& user) = 0;
};

// 具体中介者类:聊天室
class ChatRoom : public ChatRoomMediator {
public:
    void sendMessage(const std::string& message, const std::string& sender) {
        for (auto user : users) {
            if (user != sender) {
                receiveMessage(message, user);
            }
        }
    }

    void addUser(const std::string& user) {
        users.push_back(user);
    }

private:
    void receiveMessage(const std::string& message, const std::string& receiver) {
        std::cout << "接收到来自用户 " << receiver << " 的消息:" << message << std::endl;
    }

    std::vector<std::string> users;
};

// 抽象同事类:聊天室用户
class ChatRoomUser {
public:
    ChatRoomUser(const std::string& name, ChatRoomMediator* mediator) : name(name), mediator(mediator) {}

    virtual void sendMessage(const std::string& message) = 0;
    virtual void receiveMessage(const std::string& message) = 0;

protected:
    std::string name;
    ChatRoomMediator* mediator;
};

// 具体同事类:聊天室普通用户
class OrdinaryUser : public ChatRoomUser {
public:
    OrdinaryUser(const std::string& name, ChatRoomMediator* mediator) : ChatRoomUser(name, mediator) {}

    void sendMessage(const std::string& message) {
        mediator->sendMessage(message, name);
    }

    void receiveMessage(const std::string& message) {
        std::cout << name << " 收到消息:" << message << std::endl;
    }
};

int main() {
    // 创建聊天室中介者
    ChatRoomMediator* chatRoom = new ChatRoom();

    // 创建聊天室用户
    ChatRoomUser* user1 = new OrdinaryUser("User1", chatRoom);
    ChatRoomUser* user2 = new OrdinaryUser("User2", chatRoom);
    ChatRoomUser* user3 = new OrdinaryUser("User3", chatRoom);

    // 添加用户到聊天室
    chatRoom->addUser(user1->name);
    chatRoom->addUser(user2->name);
    chatRoom->addUser(user3->name);

    // 用户发送消息
    user1->sendMessage("大家好!");
    user2->sendMessage("欢迎加入聊天室!");
    user3->sendMessage("谢谢!");

    // 释放内存(可选)
    delete chatRoom;
    delete user1;
    delete user2;
    delete user3;

    return 0;
}

2 要点总结

将多个对象间复杂的关联关系解耦,Mediator 模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

随着控制逻辑的复杂化,Mediator 具体对象的实现可能相当复杂。

这时候可以对 Mediator 对象进行分解处理。

Facade 模式是解耦系统间(单向)的对象关联关系;Mediator 模式是解耦系统内各个对象之间(双向)的关联关系。