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

篇二十一:中介者模式:解耦对象之间的交互

篇二十一:"中介者模式:解耦对象之间的交互"

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

设计模式是软件开发中的重要知识,中介者模式(Mediator Pattern)是一种行为型设计模式,用于解耦对象之间的交互,从而减少对象之间的直接依赖,提高系统的灵活性和可维护性。本文将探讨中介者模式的作用和实现方式,并演示在C++中如何应用中介者模式来解耦对象之间的交互。

1. 中介者模式的作用:

中介者模式的作用在于通过引入中介者对象来管理对象之间的交互,使得对象之间不再直接相互通信,而是通过中介者进行通信,从而将系统中对象之间的耦合关系降低到最低。中介者模式包含以下核心角色:

  • 抽象中介者(Abstract Mediator):定义中介者对象的接口,用于管理对象之间的交互。
  • 具体中介者(Concrete Mediator):实现抽象中介者接口,负责协调各个同事类之间的交互关系。
  • 抽象同事类(Abstract Colleague):定义同事类的接口,用于与中介者进行通信。
  • 具体同事类(Concrete Colleague):实现抽象同事类接口,负责与其他同事类进行通信。

中介者模式的关键在于将对象之间的交互逻辑集中到中介者对象中,使得每个对象只关心自身的逻辑,而不需要知道其他对象的存在。

2. 中介者模式的实现方式:

中介者模式的实现方式一般分为以下几个步骤:

  • 定义抽象中介者类:在抽象中介者类中声明用于协调同事对象之间交互的方法。
  • 定义抽象同事类:在抽象同事类中声明用于与中介者通信的方法。
  • 定义具体中介者类:实现抽象中介者类接口,负责协调同事对象之间的交互关系。
  • 定义具体同事类:实现抽象同事类接口,负责与其他同事对象进行通信,并在需要时通过中介者对象进行交互。

3. 在C++中应用中介者模式:

以下是中介者模式的C++示例代码:

a. 定义抽象中介者类:

// Mediator.h
class Colleague;class Mediator {
public:virtual ~Mediator() {}virtual void sendMessage(const std::string& message, Colleague* colleague) = 0;
};

b. 定义抽象同事类:

// Colleague.h
#include <string>class Mediator;class Colleague {
public:Colleague(Mediator* mediator) : mediator_(mediator) {}virtual ~Colleague() {}virtual void receiveMessage(const std::string& message) = 0;virtual void sendMessage(const std::string& message) {mediator_->sendMessage(message, this);}protected:Mediator* mediator_;
};

c. 定义具体中介者类:

// ConcreteMediator.h
#include <iostream>
#include "Mediator.h"
#include "Colleague.h"class ConcreteMediator : public Mediator {
public:void sendMessage(const std::string& message, Colleague* colleague) override {if (colleague == colleagueA_) {colleagueB_->receiveMessage(message);} else if (colleague == colleagueB_) {colleagueA_->receiveMessage(message);}}void setColleagueA(Colleague* colleagueA) {colleagueA_ = colleagueA;}void setColleagueB(Colleague* colleagueB) {colleagueB_ = colleagueB;}private:Colleague* colleagueA_;Colleague* colleagueB_;
};

d. 定义具体同事类:

// ConcreteColleague.h
#include <iostream>
#include "Colleague.h"class ConcreteColleagueA : public Colleague {
public:ConcreteColleagueA(Mediator* mediator) : Colleague(mediator) {}void receiveMessage(const std::string& message) override {std::cout << "ConcreteColleagueA received message: " << message << std::endl;}
};class ConcreteColleagueB : public Colleague {
public:ConcreteColleagueB(Mediator* mediator) : Colleague(mediator) {}void receiveMessage(const std::string& message) override {std::cout << "ConcreteColleagueB received message: " << message << std::endl;}
};

e. 客户端使用:

// main.cpp
#include "ConcreteMediator.h"
#include "ConcreteColleague.h"int main() {ConcreteMediator mediator;ConcreteColleagueA colleagueA(&mediator);ConcreteColleagueB colleagueB(&mediator);mediator.setColleagueA(&colleagueA);mediator.setColleagueB(&colleagueB);colleagueA.sendMessage("Hello from ConcreteColleagueA!");colleagueB.sendMessage("Hi from ConcreteColleagueB!");return 0;
}

4. 中介者模式的代码解析:

在中介者模式中,通过引入中介者对象,将对象之间的交互逻辑集中在中介者对象中,从而使得对象之间不再直接相互通信。客户端通过中介者对象来进行对象之间的通信,实现了对象之间的解耦。

5. 最佳实践:

在使用中介者模式时,需要注意以下几点:

  • 合理设计中介者接口:中介者接口应该定义统一的通信方法,确保每个具体同事类都能够通过中介者进行通信。
  • 对象之间的依赖关系:使用中介者模式可能导致中介者对象的职责过重,需要确保中介者对象不会成为过于复杂的"上帝对象"。

**

  1. 总结:**

中介者模式是一种重要的设计模式,它通过引入中介者对象来解耦对象之间的交互,降低系统中对象之间的耦合关系。在C++中,我们可以通过抽象中介者类和具体中介者类来实现中介者模式。中介者模式特别适用于对象之间交互复杂,耦合度较高的场景,能够提高代码的灵活性和可维护性。

希望本文能够帮助您理解中介者模式的作用和实现方式,并通过C++的示例代码演示了如何在C++中应用中介者模式来解耦对象之间的交互。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩展性。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

相关文章:

篇二十一:中介者模式:解耦对象之间的交互

篇二十一&#xff1a;"中介者模式&#xff1a;解耦对象之间的交互" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式…...

tomcat的多实例,动静分离(web服务基础结束)

多实例 多实例就是在一台服务器上有多个tomcat的服务&#xff08;核心是改端口&#xff09; 实验&#xff1a;多实例 安装步骤 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomca…...

LeetCode150道面试经典题--判断子序列(简单)

1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序…...

kubeadml 安装 k8s

目录 一&#xff1a;kubeadml 安装 k8s 1、网络环境 2、 环境准备 3、 所有节点安装docker 4、所有节点安装kubeadm&#xff0c;kubelet和kubectl ​5、部署K8S集群 6、测试 二&#xff1a; 部署 Dashboard 一&#xff1a;kubeadml 安装 k8s 1、网络环境 master&am…...

考研C语言进阶题库——更新16-20题

目录 16计算t11/2...1/n-11/n 17计算1997&#xff01; 18计算t1-122-133-...-1nn 19相传国际象棋是古印度舍罕王的宰相达依尔发明的.舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐. 这位聪明的宰相指着8*8共64格的象棋说:陛下,请您赏给我一些麦子吧. 就在棋盘的第1格放1粒…...

【变形金刚01】attention和transformer所有信息

图1.来源&#xff1a;Arseny Togulev在Unsplash上的照片 一、说明 这是一篇 长文 &#xff0c;几乎讨论了人们需要了解的有关注意力机制的所有信息&#xff0c;包括自我注意、查询、键、值、多头注意力、屏蔽多头注意力和转换器&#xff0c;包括有关 BERT 和 GPT 的一些细节。因…...

面试热题(路径总和II)

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 在这里给大家提供两种方法进行思考&#xff0c;第一种方法是递归&#xff0c;第二种方式使用回溯的方式进行爆…...

测试 tensorflow 1.x 的一个demo 01

tensorflow 1.0的示例代码 demo_01.py import tensorflow as tf import os os.environ[TF_CPP_MIN_LOG_LEVEL]2def tf114_demo():a 3b 4c a bprint("a b in py ",c)a_t tf.constant(3)b_t tf.constant(4)c_t a_t b_tprint("TensorFlow add a_t b_t &…...

达蒙DM数据库使用经验

DM表/字段注释 注&#xff1a;dm数据库无法在建表的同时为字段名添加注释 //为表添加注释 comment on table 库名.表名 is 表注释; //为表字段添加注释 comment on column 库名.表名.列名 is 列注释;DM查询错误&#xff1a;无效的表或视图 1&#xff0c;确认表一定存在 2&am…...

Redis—集群

目录标题 主从复制第一次同步命令传播分担主服务器压力增量复制总结面试题什么是Redis主从复制Redis主从复制的原理Redis主从复制的优点Redis主从复制的缺点Redis主从复制的配置步骤Redis主从复制的同步策略主从节点是长还是短连接判断某个节点是否正常工作主从复制架构中&…...

【C语言】数据在内存中的存储详解

文章目录 一、什么是数据类型二、类型的基本归类三、 整型在内存中的存储1.原码、反码、补码2.大小端(1)什么是大小端(2)为什么会有大小端 四、浮点型在内存中的存储1. 浮点数存储规则 五、练习1.2.3.4.5.6.7. 一、什么是数据类型 我们可以把数据类型想象为一个矩形盒子&#x…...

PIC单片机配置字的设置

PIC单片机配置字的设置 PIC系列单片机,其芯片内部大都设置有一个特殊的程序存储单元,地址根据不同的单片机而定,此存储单元用来由单片机用户自由配置或定义单片机内部的一些功能电路单元的性能选项,所以被称之为系统配置字。目前PIC单片机系统配置字的方法有两种,一种是利…...

JavaWeb-Servlet服务连接器(一)

目录 1.Servlet生命周期 2.Servlet的配置 3.Servlet的常用方法 4.Servlet体系结构 5.HTTP请求报文 6.HTTP响应报文 1.Servlet生命周期 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称。其主要的功能是交互式地浏览和修改数据&#xff0c;生成一些动态…...

新华三超融合态势感知标准版

产品概述&#xff1a; H3C SecCenter CSAP-XS 超融合态势感知一体机产品集合了态势感知和安全流量分析探针设备能无需复杂配置&#xff1b;态势感知平台具备强大的安全分析和可视化呈现功能&#xff1b;同时具备远程专家会诊功能&#xff0c;通过云端协同实现外部安全服务资源的…...

AutoSAR系列讲解(深入篇)13.2-Mcal Port配置

目录 一、配置界面 二、通用配置 1、ConfigVariant 2、PortSafety 3、PortGeneral 三、Port配置集合...

Java旋转数组中的最小数字(图文详解版)

目录 1.题目描述 2.题解 分析 具体实现 方法一&#xff08;遍历&#xff09;&#xff1a; 方法二&#xff08;排序&#xff09;&#xff1a; 方法三&#xff08;二分查找&#xff09;&#xff1a; 1.题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&a…...

Android 13 Hotseat定制化修改——005 hotseat图标禁止形成文件夹

目录 一.背景 二.方案 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动…...

插入、希尔、归并、快速排序(java实现)

目录 插入排序 希尔排序 归并排序 快速排序 插入排序 排序原理&#xff1a; 1.把所有元素分为两组&#xff0c;第一组是有序已经排好的&#xff0c;第二组是乱序未排序。 2.将未排序一组的第一个元素作为插入元素&#xff0c;倒序与有序组比较。 3.在有序组中找到比插入…...

怎么把图片表格转换成word表格?几个步骤达成

在处理文档时&#xff0c;图片表格的转换是一个常见的需求。而手动输入表格是非常耗时的&#xff0c;因此&#xff0c;使用文本识别软件来自动转换图片表格可以大大提高工作效率。在本文中&#xff0c;我们将介绍如何使用OCR文字识别技术来将图片表格转换为Word表格。 OCR文字识…...

多线程与高并发--------阻塞队列

四、阻塞队列 一、基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的&#xff0c;而是通过一个容器&#xff08;队列&#xff09;进行通讯。 所以生产者生产完数据后扔到…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...