MediatorPattern.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #ifndef __MEDIATORPATTERN_H__
  2. #define __MEDIATORPATTERN_H__
  3. /*
  4. 中介者模式(Mediator Pattern)是一种行为设计模式,
  5. 它通过引入一个中介者对象来封装一组对象之间的交互,
  6. 使得这些对象不需要直接引用彼此,从而降低它们之间的耦合度。
  7. 中介者模式的主要目的是简化对象之间的通信,
  8. 使得系统更易于维护和扩展。
  9. 主要角色:
  10. 1. 中介者(Mediator):定义一个接口,用于与各个同事对象进行通信。
  11. 2. 具体中介者(Concrete Mediator):实现中介者接口,协调各个同事对象之间的交互。
  12. 3. 同事对象(Colleague):与中介者通信的对象,不直接引用其他同事对象。
  13. 优点:
  14. - 降低对象之间的耦合度,使得系统更易于维护和扩展。
  15. - 集中控制对象之间的交互,简化了通信逻辑。
  16. 缺点:
  17. - 中介者对象可能变得过于复杂,难以维护。
  18. 使用场景:
  19. - 对象之间存在复杂的交互关系,需要集中管理这些交互。
  20. - 希望降低对象之间的耦合度,提高系统的可维护性。
  21. 如: MQTT 协议中的消息代理充当中介者,协调发布者和订阅者之间的通信。
  22. */
  23. #include "spdlog/spdlog.h"
  24. #include <string>
  25. #include <map>
  26. namespace MediatorPattern
  27. {
  28. class AbstractMediator;
  29. /* ==================================================================
  30. * 抽象对象
  31. * ================================================================== */
  32. class AbstractCountry
  33. {
  34. public:
  35. AbstractCountry(AbstractMediator* mediator) : m_mediator(mediator) {}
  36. virtual ~AbstractCountry() {};
  37. virtual void Declare(std::string message, std::string) = 0;
  38. /* 接收消息 */
  39. virtual void setMessage(std::string message) = 0;
  40. virtual std::string getName() = 0;
  41. protected:
  42. AbstractMediator* m_mediator;
  43. };
  44. /* 具体国家 */
  45. // 阿拉巴斯坦
  46. class Alabasta : public AbstractCountry
  47. {
  48. public:
  49. using AbstractCountry::AbstractCountry;
  50. void Declare(std::string msg, std::string country) override;
  51. void setMessage(std::string msg) override;
  52. std::string getName() override;
  53. };
  54. // 德雷斯罗萨
  55. class Dressrosa : public AbstractCountry
  56. {
  57. public:
  58. using AbstractCountry::AbstractCountry;
  59. void Declare(std::string msg, std::string country) override;
  60. void setMessage(std::string msg) override;
  61. std::string getName() override;
  62. };
  63. // 露露西亚王国
  64. class Lulusia : public AbstractCountry
  65. {
  66. public:
  67. using AbstractCountry::AbstractCountry;
  68. void Declare(std::string msg, std::string country) override;
  69. void setMessage(std::string msg) override;
  70. std::string getName() override;
  71. };
  72. // 卡玛巴卡王国
  73. class Kamabaka : public AbstractCountry
  74. {
  75. public:
  76. using AbstractCountry::AbstractCountry;
  77. void Declare(std::string msg, std::string country) override;
  78. void setMessage(std::string msg) override;
  79. std::string getName() override;
  80. };
  81. /* ==================================================================
  82. * 中介
  83. * ================================================================== */
  84. /* 抽象中介类 */
  85. class AbstractMediator
  86. {
  87. public:
  88. virtual ~AbstractMediator() {};
  89. virtual void addCountry(AbstractCountry* country);
  90. virtual void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) = 0;
  91. protected:
  92. std::map<std::string, AbstractCountry*> m_mapCountry;
  93. };
  94. /* 世界政府,指定某个国家发送消息 */
  95. class WorldGovernment : public AbstractMediator
  96. {
  97. public:
  98. void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) override;
  99. };
  100. /* 革命军,全部通报消息 */
  101. class GeMingLeague : public AbstractMediator
  102. {
  103. public:
  104. void Declare(std::string message, AbstractCountry* country, std::string name = std::string()) override;
  105. };
  106. void testMediatorPattern();
  107. }
  108. #endif /* __MEDIATORPATTERN_H__ */