行为型设计模式09-中介者模式

news2024/12/24 8:29:53

🧑‍💻作者:猫十二懿

❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github

🎉公众号:猫十二懿

中介者模式

1、中介者模式介绍

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

它用于减少对象之间的直接通信,通过引入一个中介者对象来促进对象之间的松耦合。中介者模式可以帮助组织和管理复杂的交互逻辑,使得对象之间的交互更加简单和可维护。

在中介者模式中,多个对象之间的通信不再直接发生,而是通过中介者进行。中介者对象担当了对象之间的调度者和协调者的角色,它负责接收对象之间的通信请求,并将其转发给合适的接收者对象。

1.1 中介者模式基本实现

中介者模式结构图

image-20230522150506373

中介者模式的主要参与者包括以下几个角色:

  1. Colleague叫作抽象同事类
  2. ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象
  3. Mediator是抽象中介者,定义了同事对象到中介者对象的接口
  4. ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令

Colleague类:抽象同事类

/**
 * @author Shier
 * CreateTime 2023/5/22 15:08
 */
public abstract class Colleague {
    protected Mediator mediator;

    /**
     * 获取中介者对象
     * @param mediator
     */
    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

ConcreteColleague1和ConcreteColleague2等各种同事对象:

/**
 * @author Shier
 * CreateTime 2023/5/22 15:09
 */
public class ConcreteColleague1 extends Colleague {
    /**
     * 获取中介者对象
     *
     * @param mediator
     */
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    /**
     * 发送消息
     * @param message
     */
    public void send(String message) {
        this.mediator.send(message,this);
    }

    /**
     * 接受消息
     * @param message
     */
    public void notify(String message) {
        System.out.println("同事1收到消息 " + message);
    }
}


public class ConcreteColleague2 extends Colleague{
    /**
     * 获取中介者对象
     *
     * @param mediator
     */
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    /**
     * 发送消息
     * @param message
     */
    public void send(String message) {
        this.mediator.send(message,this);
    }

    /**
     * 接受消息
     * @param message
     */
    public void notify(String message) {
        System.out.println("同事2收到消息 " + message);
    }
}

Mediator类:抽象中介者类

/**
 * @author Shier
 * CreateTime 2023/5/22 15:13
 * 抽象中介者类
 */
public abstract class Mediator {
    /**
     * 发送消息的抽象方法,得到同事对象和消息
     * @param message
     * @param colleague
     */
    public abstract void send(String message, Colleague colleague);
}

ConcreteMediator类:具体中介者类。

/**
 * @author Shier
 * CreateTime 2023/5/22 15:15
 * 具体中介者类
 */
public class ConcreteMediator extends Mediator {

    /**
     * 两个同事属性
     */
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    /**
     * 知道具体同事的对象
     *
     * @param colleague1
     */
    public void setColleague1(ConcreteColleague1 colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(ConcreteColleague2 colleague2) {
        this.colleague2 = colleague2;
    }

    /**
     * 重写发送消息方法,根据不同具体同事对象做出判断通知其他同事
     * @param message
     * @param colleague
     */
    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.notify(message);
        } else {
            colleague1.notify(message);
        }
    }
}

客户端:

public class MediaClient {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        // 两个具体同事都认识中介者
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
        // 中介者认识两个同事
        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        // 同事之间进行交流
        colleague1.send("你今晚吃饭了吗?");
        colleague2.send("我今晚还没有吃饭呢");
    }
}

输出结果:

image-20230522153403328

由于有了Mediator,使得ConcreteColleague1和ConcreteColleague2在发送消息和接收信息时其实是通过中介者来完成的,这就减少了它们之间的耦合。

2、具体例子说明

例子背景说明:全世界都是通过联合国组织进行交流各国之间的事务,不同国家之间都存在在不同的利益等关系,如果没有联合国那么各个国家之间的关联就会变得紧耦合。

例子:需求是美国和伊拉克之间的对话都是通过联合国安理会作为中介来完成。

例子说明:在美国和伊拉克之间存在紧张的政治关系和潜在的冲突,彼此间的直接对话往往困难且具有挑战性。为了避免冲突升级和促进和平解决,双方同意将对话的中介角色委托给联合国安全理事会。通过联合国安理会作为中介者,可以提供一个中立、公正的平台,促进双方之间的交流和协商,以实现持久和平的解决方案。中介者的介入有助于降低紧张局势,增加对话的效果和可行性。

2.1 中介者模式 - 联合国安理会

程序结构图:

image-20230522153246192

国家类:相当于Colleague类。

/**
 * @author Shier
 * CreateTime 2023/5/22 15:34
 * 国家类
 */
public abstract class Country {
    protected UnitedNations unitedNations;

    /**
     * 得到安理会中介者
     * @param unitedNations
     */
    public Country(UnitedNations unitedNations) {
        this.unitedNations = unitedNations;
    }
}

美国类:相当于ConcreteColleague1类。

/**
 * @author Shier
 * CreateTime 2023/5/22 15:36
 * 美国类
 */
public class USA extends Country {
    /**
     * 得到安理会中介者
     *
     * @param unitedNations
     */
    public USA(UnitedNations unitedNations) {
        super(unitedNations);
    }

    /**
     * 美国发布消息
     *
     * @param message
     */
    public void declare(String message) {
        this.unitedNations.declare(message, this);
    }

    /**
     * 美国接受其他国家信息
     * @param message
     */
    public void getMessage(String message) {
        System.out.println("美国收到消息:" + message);
    }
}

伊拉克类:相当于ConcreteColleague2类

/**
 * @author Shier
 * CreateTime 2023/5/22 15:36
 * 伊拉克类
 */
public class Iraq extends Country {
    /**
     * 得到安理会中介者
     *
     * @param unitedNations
     */
    public Iraq(UnitedNations unitedNations) {
        super(unitedNations);
    }

    /**
     * 伊拉克发布消息
     *
     * @param message
     */
    public void declare(String message) {
        this.unitedNations.declare(message, this);
    }

    /**
     * 伊拉克接受其他国家信息
     * @param message
     */
    public void getMessage(String message) {
        System.out.println("伊拉克收到消息:" + message);
    }
}

联合国机构类:相当于Mediator类。

/**
 * @author Shier
 * CreateTime 2023/5/22 15:40
 * 中介者
 */
public abstract class UnitedNations {
    public abstract void declare(String message,Country country);
}

联合国安理会:相当于ConcreteMediator类。

/**
 * @author Shier
 * CreateTime 2023/5/22 15:42
 */
public class UnitedNationsSecurityCouncil extends UnitedNations {
    private USA usa;
    private Iraq iraq;

    /**
     * 联合国安理会了解所有国家,所有拥有所有国家的对象属性
     *
     * @param usa
     */
    public void setUsa(USA usa) {
        this.usa = usa;
    }

    public void setIraq(Iraq iraq) {
        this.iraq = iraq;
    }

    /**
     * 对象间的通信
     * @param message
     * @param country
     */
    @Override
    public void declare(String message, Country country) {
        if (country == this.usa) {
            iraq.getMessage(message);
        } else if (country == this.iraq){
            usa.getMessage(message);
        }
    }
}

客户端调用:

/**
 * @author Shier
 * CreateTime 2023/5/22 15:44
 */
public class CountryClient {
    public static void main(String[] args) {
        UnitedNationsSecurityCouncil council = new UnitedNationsSecurityCouncil();
        // 各个国家知道安理会存在
        USA usa = new USA(council);
        Iraq iraq = new Iraq(council);

        // 联合国安理会知道每个国家存在
        council.setUsa(usa);
        council.setIraq(iraq);

        usa.declare("不准研制核武器,否则将对你发起战争");
        iraq.declare("我并没有研制核武器,但你不要威胁我");
    }
}

结果:

image-20230522160021099

以上的程序除了类名不一样,其他基本都和中介者模式的基本实现的程序一样

3、中介者模式总结

中介者模式的优点包括:

  1. 减少了对象之间的直接耦合:通过引入中介者对象,各个对象之间不再直接通信,减少了彼此之间的依赖关系,提高了系统的灵活性和可扩展性。
  2. 简化对象之间的交互:中介者模式将对象之间的交互逻辑集中在一个对象中,使得交互变得更加简单和可维护,提高了代码的可读性。
  3. 提高代码的可维护性:通过将复杂的交互逻辑放在中介者对象中,使得代码更加集中和可维护,便于后续的修改和扩展。

中介者模式的缺点包括:

  1. 中介者对象的职责较多:中介者对象通常负责协调多个对象之间的通信,可能会导致中介者对象的职责变得复杂,难以维护和扩展。
  2. 增加了系统的复杂性:引入中介者对象后,系统中会多出一个新的对象,增加了系统的复杂性,特别是当交互逻辑变得复杂时。

适用场景:

  1. 当对象之间的通信复杂且难以维护时,可以考虑使用中介者模式来简化对象之间的交互。
  2. 当系统中存在多个对象之间的交互逻辑,并且这些交互逻辑需要集中管理时,可以使用中介者模式来将交互逻辑集中在中介者对象中。
  3. 当系统中的对象之间的关系呈现网状结构时,可以考虑使用中介者模式来简化对象之间的通信和管理。
  4. 当希望通过引入中介者对象来降低对象之间的耦合性,提高系统的灵活性和可扩展性时,可以使用中介者模式。

中介者模式在图形用户界面(GUI)开发、多人协作系统、企业应用中的分布式系统等场景下得到广泛应用。

通常负责协调多个对象之间的通信,可能会导致中介者对象的职责变得复杂,难以维护和扩展。
2. 增加了系统的复杂性:引入中介者对象后,系统中会多出一个新的对象,增加了系统的复杂性,特别是当交互逻辑变得复杂时。

适用场景:

  1. 当对象之间的通信复杂且难以维护时,可以考虑使用中介者模式来简化对象之间的交互。
  2. 当系统中存在多个对象之间的交互逻辑,并且这些交互逻辑需要集中管理时,可以使用中介者模式来将交互逻辑集中在中介者对象中。
  3. 当系统中的对象之间的关系呈现网状结构时,可以考虑使用中介者模式来简化对象之间的通信和管理。
  4. 当希望通过引入中介者对象来降低对象之间的耦合性,提高系统的灵活性和可扩展性时,可以使用中介者模式。

中介者模式在图形用户界面(GUI)开发、多人协作系统、企业应用中的分布式系统等场景下得到广泛应用。

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

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

相关文章

【MySQL数据库】MySQL 高级SQL 语句一

[TOC](MySQL 高级SQL 语句 一、MySQL 高级SQL 语句1.1select -显示表格中一个或数个字段的所有数据记录1.2distinct不显示重复的数据记录1.3where有条件查询1.4and、or且 或1.5in 显示已知的值的数据记录1.6between 显示两个值范围内的数据记录1.7通配符,通常通配符…

都2023年了,JavaScript ES6后的新(lao)特性,你用起来了吗?

前言 JavaScript ES6 指的是 ECMAScript 6,它是 JavaScript 语言第六版的规范。ES6 包含了很多新特性和语法糖,涵盖了从 ES6 开始至今所增加的所有特性。 因此,ES6 新特性是指从 ES6 开始新增到当前时刻所有的新特性,包括但不限…

FPGA XDMA 中断模式实现 PCIE X8 HDMI视频采集 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串…

四肽-21——改善皮肤紧实感、光滑感和弹性

简介 四肽-21是一种来源于皮肤自身的四胜肽,它结构独特、能高效的促进细胞外基质合成,从而减少各种皱纹和改善皮肤衰老现象。与市场上非常受欢迎的基肽(Matrixyl)相比,四肽-21效果更为突出。 Tetrapeptide-21 is a type of tetra…

LeetCode - #85 最大矩形(Top 100)

文章目录 前言1. 描述2. 示例3. 答案题解 1题解 2 关于我们 前言 本题为 LeetCode 前 100 高频题 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者&am…

解密后无法加载到指定模版,且模版名为空

问题如图: 原因:因为改变了项目的集成管理,导致变量丢失

Redis原理 - 五种数据类型的底层结构关系

原文首更地址,阅读效果更佳! Redis原理 - 五种数据类型的底层结构关系 | CoderMast编程桅杆https://www.codermast.com/database/redis/base-datatype-implement.html #字符串对象String String 是 Redis 中最常见的数据存储类型。 其基本编码方式是 …

安卓蓝牙SDP协议数据包

1. SDP概念 我们想一想,两个陌生的设备(之前未有过交互)如何去发现对方支持什么服务呢?比如Host端的Controller怎么知道远程蓝牙设备是蓝牙耳机还是HID遥控器呢?我们需要一种协议,这种协议在蓝牙设备配对成…

Git-Desktop【使用说明】

仓库操作 简单的创建仓库、删除仓库 删除点击 Remove 即可 文件操作 1、提交文件到本地仓库 2、修改文件 Git没有修改文件这一说,它只会再次提交一个新的版本到仓库中,提交修改后的文件其实是在仓库创建了一个新的文件,只不过是一个不同的…

Optano.Modeling 简单教程

前言 在工作中遇到两个需求,将两个数学公式用 .NET 的数学库找到数学公式中某个未知数的最优解,我尝试了几个数学库都没有办法完美解决我的需求,直到找到 Optano.Modeling Optano.Modeling 官网:Optano.Modeling 官网 Optano.Mo…

AI操作视频的工具最新最强集合

AI的进化日新月异,很多之前只是在想象中的操作,已经有很多可以使用AI来完成了。最新的Stable Diffusion,ControlNet,EBsynth有哪些神奇的应用,如何一键替换视频中人物和场景,如何根据文字描述即可生成梦幻视频?我们整理…

DFS/回溯/动态规划算法的融会贯通

学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章👇 在线学习网站: https://labuladong.gitee.io/algo/ 经常有读者后台问我,DFS算法/回溯算法/动态规划算法之间的区别和联系是什么? 对于这个问题,我…

私有化部署的无忧·企业文档2.1.7新版本核心功能介绍

无忧企业文档是一款针对企业用户提供在线文档、协同编辑、知识管理的基础化办公工具,产品采用B/S构架。功能覆盖场景包括:在线文档的私有化部署、团队协同、知识管理、在线文档识别的扩展、文档权限化管理等等场景。本次2.1.7版本更新了以下几个核心功能…

【机器学习】十大算法之一 “线性回归”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

什么是事件委托

文章目录 导文文章重点具体而言,事件委托包含两个主要角色:通过使用事件委托,可以实现以下优势: 代码示例 导文 事件委托是一种在软件开发中常用的设计模式,用于处理事件和回调函数。它允许一个对象(委托对…

数据帧转发过程中IP地址及MAC地址的变化

数据帧在交换机间转发 帧经过交换机时,其源、目标MAC是不会变的。 交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不…

odoo字段加密以及模糊显示

在信息时代,信息本身是把双刃剑,一方面它服务于我们的生产、生活、使我们受益; 一方面,信息的泄露可能对我们构成巨大的威胁。因此,客观上就需要一种有力的安全措施来保护机密数据不被窃取或篡改 。 数据加密与解密从宏观上讲是非…

[2022]DyOb-SLAM : Dynamic Object Tracking SLAM System

1.作者 Rushmian Annoy Wadud、Wei Sun 2.时间 2022 3.整体架构 DyOb-SLAM是DynaSLAM和VDO-SLAM的结合: 基于先验信息使用Mask RCNN分割出动态目标通过基于光流和场景流的算法对运动目标进行跟踪对静态点进行BA优化 输出: 当前帧显示ORB特征以及Masj信息和对…

探索Zabbix API:企业监控管理工具

新钛云服已累计为您分享754篇技术干货 Zabbix是一种流行的开源监控解决方案,其强大的API功能为用户提供了灵活且可扩展的监控管理能力。本文将介绍Zabbix API的基本概念和用法,以及如何利用API来简化监控配置、数据获取和自动化任务等方面的工作。 在现代…

数据结构 树

树的基本概念 树是一种非线性的数据结构,它由节点(node)和边(edge)组成。树的基本概念包括以下要点: 树由一个根节点(root)开始,根节点没有父节点,它可以有…