• C++中的中介者模式


    目录

    中介者模式(Mediator Pattern)

    实际应用

    聊天室

    空中交通管制系统

    智能家居控制系统

    总结


    中介者模式(Mediator Pattern)

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

    实际应用

    聊天室

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

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 中介者接口
    6. class ChatMediator {
    7. public:
    8. virtual void sendMessage(const std::string& message, class User* user) = 0;
    9. virtual void addUser(std::shared_ptr user) = 0;
    10. };
    11. // 用户类
    12. class User {
    13. protected:
    14. ChatMediator& mediator;
    15. std::string name;
    16. public:
    17. User(ChatMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}
    18. virtual void send(const std::string& message) = 0;
    19. virtual void receive(const std::string& message) = 0;
    20. std::string getName() const { return name; }
    21. };
    22. // 具体中介者
    23. class ChatRoom : public ChatMediator {
    24. private:
    25. std::vector> users;
    26. public:
    27. void addUser(std::shared_ptr user) override {
    28. users.push_back(user);
    29. }
    30. void sendMessage(const std::string& message, User* user) override {
    31. for (const auto& u : users) {
    32. if (u.get() != user) {
    33. u->receive(message);
    34. }
    35. }
    36. }
    37. };
    38. // 具体用户
    39. class ConcreteUser : public User {
    40. public:
    41. ConcreteUser(ChatMediator& mediator, const std::string& name) : User(mediator, name) {}
    42. void send(const std::string& message) override {
    43. std::cout << name << " sends: " << message << std::endl;
    44. mediator.sendMessage(message, this);
    45. }
    46. void receive(const std::string& message) override {
    47. std::cout << name << " received: " << message << std::endl;
    48. }
    49. };
    50. // 客户端代码
    51. int main() {
    52. ChatRoom chatRoom;
    53. auto user1 = std::make_shared(chatRoom, "User1");
    54. auto user2 = std::make_shared(chatRoom, "User2");
    55. auto user3 = std::make_shared(chatRoom, "User3");
    56. chatRoom.addUser(user1);
    57. chatRoom.addUser(user2);
    58. chatRoom.addUser(user3);
    59. user1->send("Hello everyone!");
    60. user2->send("Hi User1!");
    61. user3->send("Good morning!");
    62. return 0;
    63. }

    空中交通管制系统

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

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 中介者接口
    6. class ATCMediator {
    7. public:
    8. virtual void sendMessage(const std::string& message, class Aircraft* aircraft) = 0;
    9. virtual void addAircraft(std::shared_ptr aircraft) = 0;
    10. };
    11. // 飞机类
    12. class Aircraft {
    13. protected:
    14. ATCMediator& mediator;
    15. std::string id;
    16. public:
    17. Aircraft(ATCMediator& mediator, const std::string& id) : mediator(mediator), id(id) {}
    18. virtual void send(const std::string& message) = 0;
    19. virtual void receive(const std::string& message) = 0;
    20. std::string getId() const { return id; }
    21. };
    22. // 具体中介者
    23. class ATC : public ATCMediator {
    24. private:
    25. std::vector> aircrafts;
    26. public:
    27. void addAircraft(std::shared_ptr aircraft) override {
    28. aircrafts.push_back(aircraft);
    29. }
    30. void sendMessage(const std::string& message, Aircraft* aircraft) override {
    31. for (const auto& a : aircrafts) {
    32. if (a.get() != aircraft) {
    33. a->receive(message);
    34. }
    35. }
    36. }
    37. };
    38. // 具体飞机
    39. class ConcreteAircraft : public Aircraft {
    40. public:
    41. ConcreteAircraft(ATCMediator& mediator, const std::string& id) : Aircraft(mediator, id) {}
    42. void send(const std::string& message) override {
    43. std::cout << "Aircraft " << id << " sends: " << message << std::endl;
    44. mediator.sendMessage(message, this);
    45. }
    46. void receive(const std::string& message) override {
    47. std::cout << "Aircraft " << id << " received: " << message << std::endl;
    48. }
    49. };
    50. // 客户端代码
    51. int main() {
    52. ATC atc;
    53. auto aircraft1 = std::make_shared(atc, "AC1");
    54. auto aircraft2 = std::make_shared(atc, "AC2");
    55. auto aircraft3 = std::make_shared(atc, "AC3");
    56. atc.addAircraft(aircraft1);
    57. atc.addAircraft(aircraft2);
    58. atc.addAircraft(aircraft3);
    59. aircraft1->send("Requesting landing clearance.");
    60. aircraft2->send("Acknowledged. Waiting for clearance.");
    61. aircraft3->send("Holding pattern at 5000 feet.");
    62. return 0;
    63. }

    智能家居控制系统

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

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 中介者接口
    6. class SmartHomeMediator {
    7. public:
    8. virtual void sendMessage(const std::string& message, class Device* device) = 0;
    9. virtual void addDevice(std::shared_ptr device) = 0;
    10. };
    11. // 设备类
    12. class Device {
    13. protected:
    14. SmartHomeMediator& mediator;
    15. std::string name;
    16. public:
    17. Device(SmartHomeMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}
    18. virtual void send(const std::string& message) = 0;
    19. virtual void receive(const std::string& message) = 0;
    20. std::string getName() const { return name; }
    21. };
    22. // 具体中介者
    23. class SmartHomeController : public SmartHomeMediator {
    24. private:
    25. std::vector> devices;
    26. public:
    27. void addDevice(std::shared_ptr device) override {
    28. devices.push_back(device);
    29. }
    30. void sendMessage(const std::string& message, Device* device) override {
    31. for (const auto& d : devices) {
    32. if (d.get() != device) {
    33. d->receive(message);
    34. }
    35. }
    36. }
    37. };
    38. // 具体设备
    39. class Light : public Device {
    40. public:
    41. Light(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}
    42. void send(const std::string& message) override {
    43. std::cout << "Light " << name << " sends: " << message << std::endl;
    44. mediator.sendMessage(message, this);
    45. }
    46. void receive(const std::string& message) override {
    47. std::cout << "Light " << name << " received: " << message << std::endl;
    48. }
    49. };
    50. class Thermostat : public Device {
    51. public:
    52. Thermostat(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}
    53. void send(const std::string& message) override {
    54. std::cout << "Thermostat " << name << " sends: " << message << std::endl;
    55. mediator.sendMessage(message, this);
    56. }
    57. void receive(const std::string& message) override {
    58. std::cout << "Thermostat " << name << " received: " << message << std::endl;
    59. }
    60. };
    61. class SecurityCamera : public Device {
    62. public:
    63. SecurityCamera(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}
    64. void send(const std::string& message) override {
    65. std::cout << "Security Camera " << name << " sends: " << message << std::endl;
    66. mediator.sendMessage(message, this);
    67. }
    68. void receive(const std::string& message) override {
    69. std::cout << "Security Camera " << name << " received: " << message << std::endl;
    70. }
    71. };
    72. // 客户端代码
    73. int main() {
    74. SmartHomeController controller;
    75. auto light = std::make_shared(controller, "Living Room");
    76. auto thermostat = std::make_shared(controller, "Main");
    77. auto camera = std::make_shared(controller, "Front Door");
    78. controller.addDevice(light);
    79. controller.addDevice(thermostat);
    80. controller.addDevice(camera);
    81. light->send("Turning on the lights.");
    82. thermostat->send("Setting temperature to 22 degrees.");
    83. camera->send("Motion detected.");
    84. return 0;
    85. }

    总结

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

  • 相关阅读:
    B站:提高你的词汇量:如何用英语谈论驾驶
    @RequestMapping注解最详细解析
    rosbag遍历数据出错:(unicode error) 'utf-8' codec can't decode byte 0xcd in position 31: invalid continuation byte
    大华摄像头使用外网接收数据
    2022年测试行业的新变化
    uboot启动流程-涉及_main汇编函数
    HTTPS 的传输过程
    Stage #14 XSS注入:利用CSS内联注释突破防御
    【iOS】浅析static,const,extern关键字
    通过电商项目,详解抓包到接口测试,附图片验证码 +cookie 问题处理!
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/139617018