当前位置: 首页 > 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 最小二乘多项式拟合原理 最小二乘法是…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...