#ifndef __MEDIATORPATTERN_H__ #define __MEDIATORPATTERN_H__ /* 中介者模式(Mediator Pattern)是一种行为设计模式, 它通过引入一个中介者对象来封装一组对象之间的交互, 使得这些对象不需要直接引用彼此,从而降低它们之间的耦合度。 中介者模式的主要目的是简化对象之间的通信, 使得系统更易于维护和扩展。 主要角色: 1. 中介者(Mediator):定义一个接口,用于与各个同事对象进行通信。 2. 具体中介者(Concrete Mediator):实现中介者接口,协调各个同事对象之间的交互。 3. 同事对象(Colleague):与中介者通信的对象,不直接引用其他同事对象。 优点: - 降低对象之间的耦合度,使得系统更易于维护和扩展。 - 集中控制对象之间的交互,简化了通信逻辑。 缺点: - 中介者对象可能变得过于复杂,难以维护。 使用场景: - 对象之间存在复杂的交互关系,需要集中管理这些交互。 - 希望降低对象之间的耦合度,提高系统的可维护性。 如: MQTT 协议中的消息代理充当中介者,协调发布者和订阅者之间的通信。 */ #include "spdlog/spdlog.h" #include #include namespace MediatorPattern { class AbstractMediator; /* ================================================================== * 抽象对象 * ================================================================== */ class AbstractCountry { public: AbstractCountry(AbstractMediator* mediator) : m_mediator(mediator) {} virtual ~AbstractCountry() {}; virtual void Declare(std::string message, std::string) = 0; /* 接收消息 */ virtual void setMessage(std::string message) = 0; virtual std::string getName() = 0; protected: AbstractMediator* m_mediator; }; /* 具体国家 */ // 阿拉巴斯坦 class Alabasta : public AbstractCountry { public: using AbstractCountry::AbstractCountry; void Declare(std::string msg, std::string country) override; void setMessage(std::string msg) override; std::string getName() override; }; // 德雷斯罗萨 class Dressrosa : public AbstractCountry { public: using AbstractCountry::AbstractCountry; void Declare(std::string msg, std::string country) override; void setMessage(std::string msg) override; std::string getName() override; }; // 露露西亚王国 class Lulusia : public AbstractCountry { public: using AbstractCountry::AbstractCountry; void Declare(std::string msg, std::string country) override; void setMessage(std::string msg) override; std::string getName() override; }; // 卡玛巴卡王国 class Kamabaka : public AbstractCountry { public: using AbstractCountry::AbstractCountry; void Declare(std::string msg, std::string country) override; void setMessage(std::string msg) override; std::string getName() override; }; /* ================================================================== * 中介 * ================================================================== */ /* 抽象中介类 */ class AbstractMediator { public: virtual ~AbstractMediator() {}; virtual void addCountry(AbstractCountry* country); virtual void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) = 0; protected: std::map m_mapCountry; }; /* 世界政府,指定某个国家发送消息 */ class WorldGovernment : public AbstractMediator { public: void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) override; }; /* 革命军,全部通报消息 */ class GeMingLeague : public AbstractMediator { public: void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) override; }; void testMediatorPattern(); } #endif /* __MEDIATORPATTERN_H__ */