2023-7-14-第十九式中介者模式

news2024/10/5 21:25:51


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之中介者模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、中介者模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

中介者模式(Mediator Pattern)是一种行为型设计模式,用于解耦多个对象之间的复杂交互和通信。在中介者模式中,多个对象不直接相互通信,而是通过一个中介者对象进行通信。

中介者模式的核心思想是将对象之间的交互逻辑封装到中介者对象中,从而使得各个对象之间的关系变得松散。这样一来,每个对象只需要与中介者进行交互,而无需了解其他对象的存在和细节,从而简化了对象之间的耦合关系。

在中介者模式中,通常会有一个抽象中介者类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。同时,每个参与者(Colleague)都持有对中介者对象的引用,用于与中介者进行通信。

中介者模式的优点包括:

  1. 减少了对象之间的直接依赖,降低了耦合性,使得对象之间的交互更加灵活和可扩展。
  2. 将复杂的交互逻辑集中在中介者中,使得系统更易于理解和维护。
  3. 可以简化对象之间的通信流程,提高系统的可维护性和可扩展性。

然而,中介者模式也有一些注意事项:

  1. 过度使用中介者模式可能会导致中介者本身变得复杂和庞大,降低了代码的可读性和可维护性。因此,在应用中介者模式时需要谨慎权衡对象之间的交互复杂性和中介者的复杂性。
  2. 中介者模式可能会引入单点故障问题,即若中介者出现问题,则整个系统的交互可能会受到影响。因此,在设计中介者模式时需要考虑系统的稳定性和可靠性。

总结起来,中介者模式提供了一种通过中介者对象来管理多个对象之间交互的方式,解耦了对象之间的关系,同时简化了系统的设计和维护。它适用于对象之间的交互较为复杂、耦合度较高的场景,可以提高系统的灵活性和可扩展性。


🐱‍🐉二、中介者模式实现

在C++中实现中介者模式,可以按照以下步骤进行:

  1. 定义抽象中介者类(Mediator):该类定义了对象之间交互的接口方法。可以使用纯虚函数或者具有默认实现的虚函数来定义这些接口方法。
class Mediator {
public:
    virtual void sendMessage(const std::string& message, class Colleague* colleague) = 0;
};
  1. 定义具体中介者类(ConcreteMediator):实现抽象中介者类,并负责协调对象之间的交互。它通常会维护一个对象列表,用于管理参与者对象。
class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;

public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }

    void sendMessage(const std::string& message, Colleague* colleague) override {
        for (auto c : colleagues) {
            if (c != colleague) {
                c->receiveMessage(message);
            }
        }
    }
};
  1. 定义抽象参与者类(Colleague):该类定义了参与者对象的基本行为和属性,包括发送消息和接收消息的方法。
class Colleague {
protected:
    Mediator* mediator;

public:
    Colleague(Mediator* mediator) : mediator(mediator) {}

    virtual void sendMessage(const std::string& message) = 0;
    virtual void receiveMessage(const std::string& message) = 0;
};
  1. 定义具体参与者类(ConcreteColleague):实现抽象参与者类,并根据需要重写发送消息和接收消息的方法。
class ConcreteColleague : public Colleague {
public:
    ConcreteColleague(Mediator* mediator) : Colleague(mediator) {}

    void sendMessage(const std::string& message) override {
        mediator->sendMessage(message, this);
    }

    void receiveMessage(const std::string& message) override {
        std::cout << "Received Message: " << message << std::endl;
    }
};
  1. 在客户端代码中使用中介者模式:
int main() {
    ConcreteMediator mediator;

    ConcreteColleague colleague1(&mediator);
    ConcreteColleague colleague2(&mediator);

    mediator.addColleague(&colleague1);
    mediator.addColleague(&colleague2);

    colleague1.sendMessage("Hello, colleague2!");
    colleague2.sendMessage("Hi, colleague1!");

    return 0;
}

在上述示例中,我们创建了一个具体的中介者对象(ConcreteMediator),以及两个具体的参与者对象(ConcreteColleague)。中介者对象负责协调参与者对象之间的交互。每个参与者对象通过中介者对象来发送消息,并接收其他参与者对象的消息。

注意,在实际应用中,可能会有更复杂的参与者对象和中介者对象的交互逻辑,可以根据具体需求进行扩展和修改。同时,还可以考虑使用设计模式中的单例模式来保证中介者对象的唯一性。


🎉三、模块之间的关系

在中介者模式中,涉及以下几个模块之间的关系:

  1. 中介者(Mediator):中介者是一个抽象类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。

  2. 参与者(Colleague):参与者是指需要相互通信和交互的对象。每个参与者都持有对中介者对象的引用,用于与中介者进行通信。

  3. 具体中介者(ConcreteMediator):具体中介者类实现了中介者的接口,并负责协调参与者对象之间的交互。它维护了一个参与者对象的列表,并在接收到消息时通知其他参与者。

  4. 具体参与者(ConcreteColleague):具体参与者类实现了参与者的接口,并根据具体需求重写发送消息和接收消息的方法。它们通过中介者对象来发送消息,并接收其他参与者对象的消息。

整体关系如下图所示:

┌─────────────────┐
│    Mediator     │
├─────────────────┤
│+ sendMessage()  │
└─────────────────┘
          ▲
          │
┌─────────────────┐
│    Colleague    │
├─────────────────┤
│- mediator       │
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘
         ▲
         │
┌───────────────────────┐
│  ConcreteMediator     │
├───────────────────────┤
│- colleagues           │
│+ addColleague()       │
│+ sendMessage()        │
└───────────────────────┘
         ▲
         │
┌─────────────────┐
│ConcreteColleague│
├─────────────────┤
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘

在中介者模式中,参与者之间的交互通过中介者进行,参与者对象只需要与中介者对象进行通信,而无需了解其他参与者的存在和细节。这样一来,对象之间的耦合关系降低,系统的灵活性和可扩展性也提高了。中介者模式将复杂的交互逻辑集中在中介者中,简化了对象之间的通信和协作过程。


🐱‍🚀四、注意事项

在使用中介者模式时,有几个注意事项需要考虑:

  1. 中介者类的职责:中介者类负责协调对象之间的交互,但是需要注意避免将过多的责任和逻辑集中到中介者类中。如果中介者类变得过于庞大或复杂,可能会影响代码的可读性和维护性。因此,应该合理划分和分配参与者之间的交互逻辑,确保中介者类不至于过于臃肿。

  2. 参与者与中介者的耦合关系:虽然中介者模式可以降低参与者之间的直接依赖关系,但是参与者对象仍然需要持有对中介者对象的引用。这种引用关系会带来一定的耦合。因此,需要权衡每个参与者对象是否真正需要与中介者进行通信,并根据实际需求进行设计。

  3. 单一职责原则:参与者对象应该专注于自己的职责和行为,而不应与其他参与者对象之间直接通信。中介者模式提供了一种协调机制,以确保参与者对象之间的交互通过中介者进行。因此,在设计参与者对象时,遵循单一职责原则,将其职责和行为限制在合理的范围内。

  4. 中介者对象的唯一性:在实际应用中,可能需要确保只有一个中介者对象存在。这可以通过使用单例模式来实现,以保证系统中的中介者对象是唯一的。

  5. 系统稳定性和可靠性:中介者模式引入了一个中心化的协调机制,使得参与者对象之间的交互依赖于中介者对象。因此,在设计和实现中介者模式时,需要考虑系统的稳定性和可靠性。如果中介者对象出现问题或故障,可能会影响整个系统的功能和性能。

综上所述,中介者模式可以提供一种解耦和协调对象之间交互的方式,但也需要注意合理划分职责、避免过度集中逻辑、权衡参与者与中介者的耦合关系,并确保系统的稳定性和可靠性。


🎂五、使用场景

中介者模式适用于以下场景:

  1. 对象之间的交互复杂:当多个对象之间的交互变得复杂且难以维护时,可以使用中介者模式将交互逻辑集中管理。中介者模式能够简化对象之间的通信流程,提高系统的可维护性和可扩展性。

  2. 对象之间的耦合度高:当对象之间的耦合度较高且需要解耦时,中介者模式可以起到解耦的作用。通过引入一个中介者对象,参与者对象只需要与中介者进行通信,而无需直接依赖其他参与者对象。

  3. 系统中的消息传递和调度:当系统中存在大量的消息传递和调度时,中介者模式可以提供一种集中管理消息传递和调度的方式。中介者作为调度器,负责协调和分发消息,简化了系统中的消息处理逻辑。

  4. 事件驱动系统:当系统需要响应多个不同对象的事件,并且这些事件之间有关联或依赖关系时,中介者模式可以帮助管理和协调这些事件的处理。中介者充当了事件的中心调度者,使得各个对象之间的事件处理更加灵活和可扩展。

  5. GUI应用程序:图形用户界面(GUI)应用程序中,通常存在多个控件和组件之间的交互。使用中介者模式可以简化控件之间的通信和协作,提高用户界面的可维护性和可扩展性。

需要注意的是,中介者模式可能会引入一个单点故障问题,即如果中介者对象出现问题或故障,整个系统的交互可能会受到影响。因此,在应用中介者模式时需要权衡系统的稳定性和可靠性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于中介者模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux history 命令 ssh log

history命令可以查看最近Linux中执行的命令。 一、history常用命令 1 2 3 4 history n# 只显示最近的 n 条历史记录 history -c# 清除缓存区中的历史记录 history -w# 将缓存区的历史记录保存到文件 history -d N# 删除第 N 条历史记录 比如# 查看最近的5条命令 1 2 3 4 5 …

【DC-DC】AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式,高效率、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&…

定西扶贫惠农推介系统(ssm+jsp+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的定西扶贫惠农推介系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java …

21.JavaWeb-RBAC访问控制模型

1.RBAC RBAC&#xff08;Role-Based Access Control&#xff09;是一种基于角色的访问控制模型&#xff0c;用于管理系统中的权限控制。它是一种广泛应用的访问控制策略&#xff0c;可以确保用户只能访问其所需的资源&#xff0c;从而保证系统的安全性和完整性。 RBAC核心是将…

连接一个JavaScript文件

● 首先&#xff0c;本章我们会使用一个起始文件&#xff0c;代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

LAXCUS分布式操作系统存在的意义和价值

总有一些新用户不能理解LAXCUS分布式操作系统&#xff0c;以及它存在的意义和价值&#xff0c;我这样说吧。 下图是一个图形桌面&#xff08;LAXCUS的图形桌面&#xff0c;不是Windows、也不是Macintosh&#xff09;&#xff0c;在它后面&#xff0c;连着一个计算机集群&#…

阿里云无影云电脑价格_企业办公型1元_云桌面入口

阿里云无影云电脑配置费用&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同费用不同&#xff0c;无影云电脑是由云桌面配置、云盘、互联网访问带宽、AD Connector、桌面组共用桌面session等费用组成&#xff0c;阿里云百科分享阿里云无影云电…

列表状态值转换,状态码对应文字处理

项目中经常遇到&#xff0c;在新增及编辑的时候&#xff0c;我们根据下拉框选择状态时候&#xff0c;在列表或者详情&#xff0c;我们得根据状态码/值&#xff0c;显示对应的文字&#xff0c;这时候&#xff0c;我们就需要对值进行格式处理&#xff0c;效果如下&#xff1a; 我…

【Element】el-dialog 内使用 el-image 并添加 preview-src-list 预览,拖拽导致图片预览不完整问题

现象 el-dialog 内使用 el-image 并添加 preview-src-list 预览&#xff0c;拖拽导致图片预览不完整 <el-dialogwidth"500"v-model"visible":title"activeProp?.name"close"handleClose":draggable"true" // 可拖拽al…

归并排序与计数排序

目录 1.什么是归并排序 2.归并排序的实现 3.归并排序的非递归实现 4.计数排序 1.什么是归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的 分治&#xff08;divide-and-conquer&#xff09;策略 &…

服务保护 Sentinel

服务保护 Sentinel Sentinel 介绍Sentinel 的下载使用Sentinel 流控规则流控规则介绍流控规则演示 Sentinel 热点规则Sentinel 隔离和熔断降级Feign 整合 Sentinel线程隔离熔断降级 Sentinel 授权规则Sentinel 系统规则Sentinel 自定义异常Sentinel 资源定义url 默认资源抛出异…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器&#xff0c;它支持多种编程语言&#xff0c;具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…

线性磁悬浮多输入多输出(MIMO)系统的线性系统控制器设计、实现和分析(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​磁悬浮列车作为一种新型地面交通工具,已经在实践中得到了成功的应用。传统的EMS型磁悬浮系统在结构上简单可靠,而且在技术上…

学习C#基础知识和应用:

C#语言基础知识&#xff1a;了解C#的开发环境、变量、语法和程序结构等基础内容。这些知识是理解和开发C#自动化控制系统的前提。刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 Winform窗体控件的应用&#xff1a;Wi…

京东零售 / hotkey 热点key探测工具使用

1、安装etcd 在etcd下载页面下载对应操作系统的etcd&#xff0c;https://github.com/etcd-io/etcd/releases 使用3.4.x以上。 2、启动worker&#xff08;集群&#xff09; 下载并编译好代码&#xff0c;将worker打包为jar&#xff0c;启动即可。如&#xff1a; java -jar $J…

北邮国院物联网 Microprocessor 微处理器笔记

Introduction-随便聊 嵌入式系统是什么&#xff1f;专用的计算机系统。为专门功能可能对计算机架构&#xff0c;外设等做出一些取舍。 通常的限制&#xff1a;Cost&#xff08;比如大量部署传感器节点&#xff09;&#xff0c;Size and weight limits&#xff08;特定应用场景…

PHP代码审计(一)之PHP代码审计的意义

PHP代码审计的意义 什么是代码审计 什么是代码审计&#xff1f;代码审计就是获取目标的源代码&#xff0c;这个目标可以是一个网站&#xff0c;也可以是一个手机app&#xff0c;只要我们得到了目标的源代码&#xff0c;我们就可以去挖掘目标系统的漏洞&#xff0c;代码审计是…

详解Jenkins配置邮件通知

前言 这几天Darren洋在使用Jenkins定时构建jmeter脚本中&#xff0c;要用到邮箱配置&#xff0c;故记录之。 一、Jenkins默认邮箱通知 这里填好smtp服务器地址和邮箱后缀&#xff0c;这样下面的账号就不用加邮箱后缀了。 网易邮箱设置以下我就不说废话文学了&#xff0c;直接上…

从零搭建ros间的通信,各功能包、节点之间的通信

新建消息类型 catkin_create_pkg car_interfaces roscpp rospy std_msgs message_generation message_runtime书写自定义的msg&#xff1a; 比如我写一个GlobalPathPlanningInterface.msg&#xff1a; float64 timestamp #时间戳 float32[] startpoint #起点位置&#x…

【技能实训】DMS数据挖掘项目-Day01

文章目录 任务1 项目准备一、开发环境二、系统简介三、项目创建 任务2【任务2.1】菜单项设计及其测试【任务2.2】使用数组存储采集的数据【任务2.3】控制显示采集的数据 任务1 项目准备 一、开发环境 1.JDK8下载及其环境变量配置(JDK8以上版本) 2.IDE &#xff1a;Eclipse 或…