C++ 设计模式:中介者模式(Mediator Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 门面模式
链接:C++ 设计模式 - 代理模式
链接:C++ 设计模式 - 适配器

中介者模式(Mediator Pattern)是行为型设计模式之一,它的主要目的是通过一个中介者对象来封装(封装变化)一系列对象之间的交互。中介者模式使各对象不需要显式地相互引用(编译时依赖-->运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互。

1.问题分析

在复杂系统中,对象之间的交互可能非常复杂,导致系统难以维护和扩展。中介者模式通过引入一个中介者对象,来管理和协调这些对象之间的交互,从而简化对象之间的关系。

2.实现步骤

  1. 定义中介者接口:声明用于与各对象交互的方法。
  2. 定义参与者基类:声明交互方法。
  3. 定义具体的参与者类:创建多个具体的参与者类,实现交互方法。
  4. 定义具体中介者:实现中介者接口,并协调各对象之间的交互。
  5. 客户端代码:通过中介者与各参与者交互。

3.代码示例

以机器人群之间的通信作为示例。

3.1.定义中介者接口

cpp 复制代码
// 中介者接口
class Mediator {
 public:
  virtual void sendMessage(const std::string& message, class Robot* robot) = 0;
};

3.2.定义机器人基类

cpp 复制代码
class Robot {
 public:
  Robot(std::shared_ptr<Mediator> mediator, const std::string& name) : mediator_(mediator), name_(name) {}

  virtual void sendMessage(const std::string& message) = 0;
  virtual void receiveMessage(const std::string& message) = 0;
  std::string getName() const { return name_; }

 protected:
  std::shared_ptr<Mediator> mediator_;
  std::string name_;
};

3.3.定义具体的机器人类

cpp 复制代码
// 具体的机器人类1
class ConcreteRobot1 : public Robot {
 public:
  ConcreteRobot1(std::shared_ptr<Mediator> mediator, const std::string& name) : Robot(mediator, name) {}

  void sendMessage(const std::string& message) override { mediator_->sendMessage(message, this); }
  void receiveMessage(const std::string& message) override { std::cout << "Robot1 (" << name_ << ") received: " << message << std::endl; }
};
cpp 复制代码
// 具体的机器人类2
class ConcreteRobot2 : public Robot {
 public:
  ConcreteRobot2(std::shared_ptr<Mediator> mediator, const std::string& name) : Robot(mediator, name) {}

  void sendMessage(const std::string& message) override { mediator_->sendMessage(message, this); }
  void receiveMessage(const std::string& message) override { std::cout << "Robot2 (" << name_ << ") received: " << message << std::endl; }
};

3.4.定义具体的中介者类

cpp 复制代码
// 具体的中介者类
class ConcreteMediator : public Mediator {
 public:
  void addRobot(std::shared_ptr<Robot> robot) {
    auto it = std::find(robots_.begin(), robots_.end(), robot);
    if (it == robots_.end()) {
      robots_.push_back(robot);
    } else {
      std::cout << "Robot (" << robot->getName() << ") is already added." << std::endl;
    }
  }

  void sendMessage(const std::string& message, Robot* sender) override {
    for (const auto& robot : robots_) {
      if (robot.get() != sender) {
        robot->receiveMessage(message);
      }
    }
  }

 private:
  std::vector<std::shared_ptr<Robot>> robots_;
};

3.5.客户端代码

cpp 复制代码
int main() {
  auto mediator = std::make_shared<ConcreteMediator>();
  auto robot1 = std::make_shared<ConcreteRobot1>(mediator, "Robot1");
  auto robot2 = std::make_shared<ConcreteRobot2>(mediator, "Robot2");

  mediator->addRobot(robot1);
  mediator->addRobot(robot2);

  robot1->sendMessage("My position is (10, 20)");
  robot2->sendMessage("My position is (30, 40)");

  return 0;
}
相关推荐
qq_4663024517 小时前
vs2008 Hotlink实时数据读取
c++·qt
阿达King哥18 小时前
关于C++中的typedef typename的含义
c++
AM越.19 小时前
Java设计模式详解--装饰器设计模式(含uml图)
java·设计模式·uml
咔咔咔的19 小时前
3652. 按策略买卖股票的最佳时机
c++
欧特克_Glodon21 小时前
基于Qt+VTK实现的CT/MR影像浏览工具,支持体渲染及体模型剪裁
c++·qt·vtk·体渲染·裁剪
似水এ᭄往昔1 天前
【C++】--封装红⿊树实现mymap和myset
开发语言·数据结构·c++·算法·stl
charlie1145141911 天前
嵌入式现代C++教程:C++98——从C向C++的演化(3)
c语言·开发语言·c++·笔记·学习·嵌入式
moonquakeTT1 天前
C++:深拷贝与浅拷贝
c++
程序员zgh1 天前
C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)
c语言·开发语言·jvm·c++
冉佳驹1 天前
C++ ——— 仿函数的使用、继承方式、赋值转换规则、菱形继承与虚继承
c++·继承·virtual·仿函数·菱形继承·模板特化·虚继承