| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #ifndef __MEDIATORPATTERN_H__
- #define __MEDIATORPATTERN_H__
- /*
- 中介者模式(Mediator Pattern)是一种行为设计模式,
- 它通过引入一个中介者对象来封装一组对象之间的交互,
- 使得这些对象不需要直接引用彼此,从而降低它们之间的耦合度。
- 中介者模式的主要目的是简化对象之间的通信,
- 使得系统更易于维护和扩展。
- 主要角色:
- 1. 中介者(Mediator):定义一个接口,用于与各个同事对象进行通信。
- 2. 具体中介者(Concrete Mediator):实现中介者接口,协调各个同事对象之间的交互。
- 3. 同事对象(Colleague):与中介者通信的对象,不直接引用其他同事对象。
- 优点:
- - 降低对象之间的耦合度,使得系统更易于维护和扩展。
- - 集中控制对象之间的交互,简化了通信逻辑。
- 缺点:
- - 中介者对象可能变得过于复杂,难以维护。
- 使用场景:
- - 对象之间存在复杂的交互关系,需要集中管理这些交互。
- - 希望降低对象之间的耦合度,提高系统的可维护性。
- 如: MQTT 协议中的消息代理充当中介者,协调发布者和订阅者之间的通信。
- */
- #include "spdlog/spdlog.h"
- #include <string>
- #include <map>
- 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<std::string, AbstractCountry*> 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__ */
|