C++中的中介者模式

目录

[中介者模式(Mediator Pattern)](#中介者模式(Mediator Pattern))

实际应用

聊天室

空中交通管制系统

智能家居控制系统

总结


中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它定义了一个对象来封装一系列对象之间的交互。通过使用中介者模式,减少了对象之间的直接依赖,使对象的交互变得松散耦合,从而提高系统的可维护性和可扩展性。

实际应用

聊天室

-- 管理用户之间的消息传递。

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

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

// 用户类
class User {
protected:
    ChatMediator& mediator;
    std::string name;
public:
    User(ChatMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}
    virtual void send(const std::string& message) = 0;
    virtual void receive(const std::string& message) = 0;
    std::string getName() const { return name; }
};

// 具体中介者
class ChatRoom : public ChatMediator {
private:
    std::vector<std::shared_ptr<User>> users;
public:
    void addUser(std::shared_ptr<User> user) override {
        users.push_back(user);
    }

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

// 具体用户
class ConcreteUser : public User {
public:
    ConcreteUser(ChatMediator& mediator, const std::string& name) : User(mediator, name) {}

    void send(const std::string& message) override {
        std::cout << name << " sends: " << message << std::endl;
        mediator.sendMessage(message, this);
    }

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

// 客户端代码
int main() {
    ChatRoom chatRoom;

    auto user1 = std::make_shared<ConcreteUser>(chatRoom, "User1");
    auto user2 = std::make_shared<ConcreteUser>(chatRoom, "User2");
    auto user3 = std::make_shared<ConcreteUser>(chatRoom, "User3");

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

    user1->send("Hello everyone!");
    user2->send("Hi User1!");
    user3->send("Good morning!");

    return 0;
}

空中交通管制系统

-- 管理飞机之间的通信。

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

// 中介者接口
class ATCMediator {
public:
    virtual void sendMessage(const std::string& message, class Aircraft* aircraft) = 0;
    virtual void addAircraft(std::shared_ptr<Aircraft> aircraft) = 0;
};

// 飞机类
class Aircraft {
protected:
    ATCMediator& mediator;
    std::string id;
public:
    Aircraft(ATCMediator& mediator, const std::string& id) : mediator(mediator), id(id) {}
    virtual void send(const std::string& message) = 0;
    virtual void receive(const std::string& message) = 0;
    std::string getId() const { return id; }
};

// 具体中介者
class ATC : public ATCMediator {
private:
    std::vector<std::shared_ptr<Aircraft>> aircrafts;
public:
    void addAircraft(std::shared_ptr<Aircraft> aircraft) override {
        aircrafts.push_back(aircraft);
    }

    void sendMessage(const std::string& message, Aircraft* aircraft) override {
        for (const auto& a : aircrafts) {
            if (a.get() != aircraft) {
                a->receive(message);
            }
        }
    }
};

// 具体飞机
class ConcreteAircraft : public Aircraft {
public:
    ConcreteAircraft(ATCMediator& mediator, const std::string& id) : Aircraft(mediator, id) {}

    void send(const std::string& message) override {
        std::cout << "Aircraft " << id << " sends: " << message << std::endl;
        mediator.sendMessage(message, this);
    }

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

// 客户端代码
int main() {
    ATC atc;

    auto aircraft1 = std::make_shared<ConcreteAircraft>(atc, "AC1");
    auto aircraft2 = std::make_shared<ConcreteAircraft>(atc, "AC2");
    auto aircraft3 = std::make_shared<ConcreteAircraft>(atc, "AC3");

    atc.addAircraft(aircraft1);
    atc.addAircraft(aircraft2);
    atc.addAircraft(aircraft3);

    aircraft1->send("Requesting landing clearance.");
    aircraft2->send("Acknowledged. Waiting for clearance.");
    aircraft3->send("Holding pattern at 5000 feet.");

    return 0;
}

智能家居控制系统

-- 用中介者模式来管理不同设备之间的通信。

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

// 中介者接口
class SmartHomeMediator {
public:
    virtual void sendMessage(const std::string& message, class Device* device) = 0;
    virtual void addDevice(std::shared_ptr<Device> device) = 0;
};

// 设备类
class Device {
protected:
    SmartHomeMediator& mediator;
    std::string name;
public:
    Device(SmartHomeMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}
    virtual void send(const std::string& message) = 0;
    virtual void receive(const std::string& message) = 0;
    std::string getName() const { return name; }
};

// 具体中介者
class SmartHomeController : public SmartHomeMediator {
private:
    std::vector<std::shared_ptr<Device>> devices;
public:
    void addDevice(std::shared_ptr<Device> device) override {
        devices.push_back(device);
    }

    void sendMessage(const std::string& message, Device* device) override {
        for (const auto& d : devices) {
            if (d.get() != device) {
                d->receive(message);
            }
        }
    }
};

// 具体设备
class Light : public Device {
public:
    Light(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}

    void send(const std::string& message) override {
        std::cout << "Light " << name << " sends: " << message << std::endl;
        mediator.sendMessage(message, this);
    }

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

class Thermostat : public Device {
public:
    Thermostat(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}

    void send(const std::string& message) override {
        std::cout << "Thermostat " << name << " sends: " << message << std::endl;
        mediator.sendMessage(message, this);
    }

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

class SecurityCamera : public Device {
public:
    SecurityCamera(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}

    void send(const std::string& message) override {
        std::cout << "Security Camera " << name << " sends: " << message << std::endl;
        mediator.sendMessage(message, this);
    }

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

// 客户端代码
int main() {
    SmartHomeController controller;

    auto light = std::make_shared<Light>(controller, "Living Room");
    auto thermostat = std::make_shared<Thermostat>(controller, "Main");
    auto camera = std::make_shared<SecurityCamera>(controller, "Front Door");

    controller.addDevice(light);
    controller.addDevice(thermostat);
    controller.addDevice(camera);

    light->send("Turning on the lights.");
    thermostat->send("Setting temperature to 22 degrees.");
    camera->send("Motion detected.");

    return 0;
}

总结

中介者模式可以帮助我们将对象之间的交互封装在一个中介者对象中,从而减少对象之间的直接依赖。

相关推荐
汉克老师9 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者9 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN114267600810 小时前
1.3第一个程序的介绍
开发语言·qt
天若有情67310 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_1998868710 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao173383710 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
blue_ice .10 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^1382879887211 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
shada11 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++
泡海椒11 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言