当前位置: 首页 > news >正文

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

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

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

1.问题分析

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

2.实现步骤

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

3.代码示例

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

3.1.定义中介者接口

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

3.2.定义机器人基类

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.定义具体的机器人类

// 具体的机器人类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; }
};
// 具体的机器人类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.定义具体的中介者类

// 具体的中介者类
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.客户端代码

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;
}

http://www.mrgr.cn/news/81897.html

相关文章:

  • openmv运行时突然中断并且没断联只是跟复位了一样
  • 检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作
  • spring spring-boot spring-cloud发布以及适配
  • Windows server2019关闭IE增强安全网站内容被阻止
  • XML在线格式化 - 加菲工具
  • LineArt:无需训练的高质量设计绘图生成方法,可保留结构准确性并生成高保真外观。
  • gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
  • 自定义 Element Plus 树状表格图标
  • ArcGIS Pro地形图四至角图经纬度标注与格网标注
  • html+css+js网页设计 美食 家美食1个页面
  • 【Rust自学】8.3. String类型 Pt.1:字符串的创建、更新与拼接
  • 被裁20240927 --- 嵌入式硬件开发 STM32篇
  • SonarQube相关的maven配置及使用
  • 【Rust自学】8.2. Vector + Enum的应用
  • 【Rust自学】7.4. use关键字 Pt.1:use的使用与as关键字
  • 内网学习:工作组用户与权限
  • Linux 配置SSH互信
  • 【探索 Stratovirt:开启虚拟化新征程】
  • 第三方接口设计注意要点
  • Java并发编程面试题:锁(17题)
  • windows11 mysql9.1.0安装问题一网打尽
  • Windows安装Confluence详解
  • Dubbo3入门项目搭建
  • 一文大白话讲清楚CSS盒子模型和块级格式化上下文(BFC)
  • LeetCode -Hot100 -75. 颜色分类
  • cesium小知识:ScreenSpaceEventHandler 详解示例