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

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录

1、中介者模式(Mediator Pattern)含义

2、中介者模式的UML图学习

3、中介者模式的应用场景

4、中介者模式的优缺点

(1)优点

(2)缺点

5、C++实现中介者模式的实例


1、中介者模式(Mediator Pattern)含义

中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互吸引,从而使其耦合松散,而且可以独立地改变它们之间地交互。【DP】

中介者模式是一种行为型设计模式,它通过引入一个中介者对象来协调多个相关对象之间的交互。中介者模式将对象之间的通信封装在中介者对象中,从而降低了对象之间的耦合性。

2、中介者模式的UML图学习

中介者模式的几个角色:

(1)中介者(Mediator):定义了各个相关对象之间通信的接口,通常包括发送消息、注册和移除对象等方法。

(2)具体中介者(Concrete Mediator):实现中介者接口,协调各个相关对象之间的通信。

(3)同事类(Colleague):定义了各个相关对象的接口,包括发送消息、接收消息等方法。

(4)具体同事类(Concrete Colleague):实现同事类接口,与其他同事类进行通信。

3、中介者模式的应用场景

(1)系统中对象之间存在复杂的交互关系,导致每个对象都需要与多个其他对象进行通信。

(2)对象之间的交互逻辑较为复杂,难以维护和理解。

(3)希望减少对象之间的直接依赖关系,提高系统的可扩展性和灵活性。

4、中介者模式的优缺点

(1)优点

        1)减少了对象之间的直接依赖:中介者模式将对象之间的通信逻辑封装在中介者对象中,使得对象之间不需要直接引用彼此,从而降低了对象之间的耦合性。

        2)简化了对象之间的交互:中介者模式集中了对象之间的交互逻辑,使得交互变得简单明确。

        3)提高了系统的可扩展性:由于对象之间的通信逻辑集中在中介者对象中,新增或修改一个相关对象不会影响其他对象。

(2)缺点

        1)中介者对象可能变得复杂:随着系统中对象之间交互关系的增加,中介者对象可能变得庞大复杂。

        2)违反了单一职责原则:中介者对象承担了协调各个对象之间通信的责任,可能导致其职责过重。

5、C++实现中介者模式的实例


#include <iostream>
#include <string>class Colleague;// 中介者接口
class Mediator 
{
public:virtual void sendMessage(const std::string& message, Colleague* colleague) = 0;
};// 同事类
class Colleague 
{
protected:Mediator* mediator;public:explicit Colleague(Mediator* med) : mediator(med) {}virtual void receiveMessage(const std::string& message) = 0;virtual void sendMessage(const std::string& message) = 0;
};// 具体中介者
class ConcreteMediator : public Mediator 
{
private:Colleague* colleague1;Colleague* colleague2;public:void setColleague1(Colleague* col) {colleague1 = col;}void setColleague2(Colleague* col) {colleague2 = col;}void sendMessage(const std::string& message, Colleague* colleague) override {if (colleague == colleague1) {colleague2->receiveMessage(message);}else if (colleague == colleague2) {colleague1->receiveMessage(message);}}
};// 具体同事类
class ConcreteColleague1 : public Colleague 
{
public:explicit ConcreteColleague1(Mediator* med) : Colleague(med) {}void receiveMessage(const std::string& message) override {std::cout << "ConcreteColleague1 received: " << message << std::endl;}void sendMessage(const std::string& message) override {mediator->sendMessage(message, this);}
};class ConcreteColleague2 : public Colleague 
{
public:explicit ConcreteColleague2(Mediator* med) : Colleague(med) {}void receiveMessage(const std::string& message) override {std::cout << "ConcreteColleague2 received: " << message << std::endl;}void sendMessage(const std::string& message) override {mediator->sendMessage(message, this);}
};int main() 
{ConcreteMediator mediator;ConcreteColleague1 colleague1(&mediator);ConcreteColleague2 colleague2(&mediator);mediator.setColleague1(&colleague1);mediator.setColleague2(&colleague2);colleague1.sendMessage("Hello, colleague2!");colleague2.sendMessage("Hi, colleague1!");return 0;
}

在上述示例中,我们定义了中介者接口Mediator和具体中介者ConcreteMediator,以及同事类Colleague和具体同事类ConcreteColleague。通过实现这些接口和类,我们可以创建一个中介者对象来协调两个同事对象之间的通信。

相关文章:

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录 1、中介者模式&#xff08;Mediator Pattern&#xff09;含义 2、中介者模式的UML图学习 3、中介者模式的应用场景 4、中介者模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现中介者模式的实例 1、中介者模式&#xff08;Media…...

期权是什么?期权的优缺点是什么?

期权是一种合约&#xff0c;有看涨期权和看跌期权两种类型&#xff0c;也就是做多和做空两个方向&#xff0c;走势标的物对应大盘指数&#xff0c;这也是期权与其他金融工具的主要区别之一&#xff0c;可以用于套利&#xff0c;对冲股票和激进下跌的风险&#xff0c;下文介绍期…...

目标检测任务数据集的数据增强中,图像垂直翻转和xml标注文件坐标调整

需求&#xff1a; 数据集的数据增强中&#xff0c;有时需要用到图像垂直翻转的操作&#xff0c;图像垂直翻转后&#xff0c;对应的xml标注文件也需要做坐标的调整。 解决方法&#xff1a; 使用pythonopencvimport xml.etree.ElementTree对图像垂直翻转和xml标…...

html5提供的FileReader是一种异步文件读取文件中的数据

前言&#xff1a;FileReader是一种异步文件读取机制&#xff0c;结合input:file可以很方便的读取本地文件。 input:file 在介绍FileReader之前&#xff0c;先简单介绍input的file类型。 <input type"file" id"file"> input的file类型会渲染为一个按…...

Linux学习记录——이십오 多线程(2)

文章目录 1、理解原生线程库线程局部存储 2、互斥1、并发代码&#xff08;抢票&#xff09;2、锁3、互斥锁的实现原理 3、线程封装1、线程本体2、封装锁 4、线程安全5、死锁6、线程同步1、条件变量1、接口2、demo代码 1、理解原生线程库 线程库在物理内存中存在&#xff0c;也…...

单片机(二)使用位移 让灯亮

一&#xff1a;硬件电路 P2 口&#xff1a; P2.0~ P2.7 是这些 I0 口 LED 阳极接 电源 &#xff0c; P20 口 为低电平 可以让 LED灯 亮 二&#xff1a;软件实现部分 两种 ① 通过循环 来展示从左 到右 #include "reg52.h"#define LED_PORT P2 // 定义单片机的P2端…...

探究代理服务器在网络安全与爬虫中的双重作用

在如今高度互联的世界中&#xff0c;代理服务器已经成为网络安全和爬虫开发的关键工具。本文将深入探讨Socks5代理、IP代理、网络安全、爬虫、HTTP等关键词&#xff0c;以揭示代理服务器在这两个领域中的双重作用&#xff0c;以及如何充分利用这些技术来保障安全和获取数据。 …...

JavaWeb-学习目录

技术栈介绍 文章目录 1.数据库&#xff1a;1.1 Mysql1.2 JDBC1.3 Maven1.4 Mybatis 2.前端2.1 HTMLCSSJS2.2 AjaxVueElementUI 3. Web核心3.1 TomcatHttpServlet3.2 RequestResponse3.3 JSP3.4 CookieSession3.5 FilterListener 1.数据库&#xff1a; 1.1 Mysql mysql&#…...

C语言题目 - 调用qsort函数对数组进行排序

题目 如题 思路 其实没什么难的&#xff0c;只要严格按照 qsort 函数的参数来填充即可&#xff0c;这里要用到函数指针。 qsort 函数的原型如下&#xff1a; void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); 参数说明&…...

Matplotlib学习笔记

Matplotlib数据可视化库 jupyter notebook优势 画图优势&#xff0c;画图与数据展示同时进行。数据展示优势&#xff0c;不需要二次运行&#xff0c;结果数据会保留。 Matplotlib画图工具 专用于开发2D图表以渐进、交互式方式实现数据可视化 常规绘图方法 子图与标注 想要…...

对比flink cdc和canal获取mysql binlog优缺点

Flink CDC和Canal都是用于获取MySQL binlog的工具&#xff0c;但是有以下几点优缺点对比&#xff1a; Flink CDC是一个基于Flink的库&#xff0c;可以直接在Flink中使用&#xff0c;无需额外的组件或服务&#xff0c;而Canal是一个独立的服务&#xff0c;需要单独部署和运行&a…...

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构&#xff0c;那么对于同一种服务&#xff0c;当然不可能只有一个节点&#xff0c;需要部署多个节点 架构图如下&#xff1a; 由上可以看出存在多个同一种服务提供者&#xff08;Service Provider&#xff09; 搭建服务提供者集…...

.NET 8 Preview 7 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang .NET 8 Preview 7 现在已经发布&#xff0c;其中包括了对 ASP.NET Core 的许多重要更新。 以下是预览版本中新增功能的摘要&#xff1a; 服务器和中间件 防伪中间件 API 编写 最小 API 的防伪集成 Native AOT 请求委托…...

Ajax+Vue+ElementUI

文章目录 1.Ajax1.1 介绍1.2 Ajax快速入门1.3 案例-用户注册时&#xff0c;检测用户名是否数据库已经存在1.4 Axios1.4.1 Axios快速入门1.4.2 请求别名 1.5 JSON1.5.1 Json的基础语法1.5.2 FastJson的使用5.3.2 Fastjson 使用 2. Vue2.1 介绍2.2 Vue快速入门2.3 Vue常用指令和生…...

python读取pdf、doc、docx、ppt、pptx文件内容

使用python读取文件&#xff0c;其中pdf、docx、pptx可以直接读&#xff0c;.ppt和.doc文件不能直接读&#xff0c;需要转换成.pptx和.docx文件&#xff0c;并且需要区分系统 如果是linux系统&#xff0c;请先安装组件 #doc2docx yum install -y libreoffice-headless yum ins…...

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…...

maven无法从阿里云中央仓库下载jar包的解决方法

这个方法不一定适用于所有人。 问题描述&#xff1a;启动公司的SpringBoot项目时&#xff0c;maven爆红提示从阿里云中央仓库找不到目标jar包&#xff0c;但我本地maven仓库是有这个jar包的&#xff08;版本也对的上&#xff09;&#xff0c;我就好奇maven为什么不从本地获取ja…...

Nevron Open Vision for .NET Crack

Nevron Open Vision for .NET Crack NET Vision是一个用于生成具有数据可视化功能的强大数据表示应用程序的包。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、许多功能和卓越的演示使复杂数据的可视化变…...

玩转单元测试之cppmockfree

引言 前文我们已经讲解了gmock的基本语法&#xff0c;但是gmock只能mock虚函数&#xff0c;如果要mock非虚成员函数、静态成员函数、全局函数、重载函数、模板函数以及其他依赖库的函数时&#xff0c;gmock就很难实现。而cppmockfree可以支持这些函数的mock。 快速入门 1. m…...

Open3D点云数据处理(二十一):最小二乘多项式拟合

文章目录 1 最小二乘多项式拟合原理2 多项式拟合的评估指标3 使用np.polyfit()函数实现3.1 np.polyfit() 函数详解3.2 代码实现3.3 使用numpy.poly1d()函数将多项式系数转换为拟合方程4 注意事项专栏目录:Open3D点云数据处理(Python) 1 最小二乘多项式拟合原理 最小二乘法是…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...