【设计模式深度剖析】【6】【行为型】【中介者模式】

文章目录

  • 中介者模式
  • 定义
    • 英文原文
    • 直译
    • 如何理解?
  • 中介者模式的角色
    • 1. 中介者(Mediator)
    • 2. 具体中介者(ConcreteMediator)
    • 3. 同事(Colleague)
    • 类图
    • 代码示例
  • 中介者模式的应用
    • 优点
    • 缺点
    • 使用场景

中介者模式

中介者模式Mediator)也称调停者模式

复杂的网状结构——>星型结构:通过中介者来调停每个类只与中介者有联系,通过中介者解耦。

中介者模式就像是一位“交通警察”,在繁忙的十字路口指挥车辆和行人有序通过,避免他们之间的直接冲突和混乱。

定义

英文原文

Defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects delegate their interaction to a mediator object instead of interacting with each other directly.

直译

中介者模式定义了一个单独的(中介)对象,用于封装一组对象之间的交互。这组对象将它们的交互委托给中介对象,而不是直接相互交互。

如何理解?

  • 松散耦合:中介者模式通过中介者对象封装了对象之间的交互,使得对象之间不需要直接引用,实现了松散耦合。
  • 独立变化:由于交互逻辑被封装在中介者对象中,因此可以独立地改变对象之间的交互,而不需要修改大量的代码。

假设你正在组织一个家庭聚会,有很多亲戚朋友参与。如果你让每个参与者都直接与每个人交流(例如,每个人都要告诉其他人他们的饮食偏好),那么场面可能会非常混乱,而且很难确保每个人都得到了正确的信息。这时,你可以充当一个“中介者”的角色,让每个人只与你交流他们的需求,然后你再将这些需求传达给其他人。这样,整个聚会过程就会变得更加有序和高效。这就是中介者模式在现实生活中的一个简单应用。

中介者模式的角色

1. 中介者(Mediator)

定义了一个接口,用于封装多个同事(Colleague)对象之间的交互行为,协调它们之间的通信。

  • 维护同事对象之间的关联关系。
  • 协调多个同事对象之间的交互。
  • 封装了同事对象之间的通信细节。

2. 具体中介者(ConcreteMediator)

实现了中介者接口,定义了具体的协调同事对象交互的逻辑。

  • 了解并维护它的各个同事:提供注册同事对象的方法,持有同事对象的引用列表。
  • 实现协调同事对象交互的逻辑。

3. 同事(Colleague)

持有中介者的引用,通过中介者与其他同事对象通信。

  • 每一个同事类都知道它的中介者对象:持有中介者的引用。
  • 提供注册到中介者的方法。
  • 接收来自中介者的消息。
  • 每一个同事对象在需要与其他同事通信的时候,与它的中介者通信:发送消息给中介者,再由中介者转发给其他同事。

类图

在这里插入图片描述

代码示例

package com.polaris.designpattern.list3.behavioral.pattern06.mediator.classicdemo;

import java.util.ArrayList;
import java.util.List;

//中介者接口
interface Mediator {
    void register(Colleague colleague);

    void relay(Colleague source, String message);
}

//具体中介者实现
class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void relay(Colleague source, String message) {
        for (Colleague otherColleague : colleagues) {
            if (!otherColleague.equals(source)) {
                otherColleague.receive(message);
            }
        }
    }
}


//同事接口
interface Colleague {
    void registerWith(Mediator mediator);

    void receive(String message);

    void send(String message);
}

//具体同事实现
class ColleagueA implements Colleague {
    private Mediator mediator;

    public ColleagueA(Mediator mediator) {
        this.mediator = mediator;
        this.mediator.register(this); // 注册到中介者  
    }

    @Override
    public void registerWith(Mediator mediator) {
        // 已在构造函数中注册,这里无需实现  
    }

    @Override
    public void receive(String message) {
        System.out.println("ColleagueA received: " + message);
    }

    @Override
    public void send(String message) {
        mediator.relay(this, message); // 委托给中介者发送消息  
    }
}

// 同事B的实现与A类似
class ColleagueB implements Colleague {
    private Mediator mediator;

    public ColleagueB(Mediator mediator) {
        this.mediator = mediator;
        this.mediator.register(this); // 注册到中介者  
    }

    @Override
    public void registerWith(Mediator mediator) {
        // 已在构造函数中注册,这里无需实现  
    }

    @Override
    public void receive(String message) {
        System.out.println("ColleagueB received: " + message);
    }

    @Override
    public void send(String message) {
        mediator.relay(this, message); // 委托给中介者发送消息  
    }
}


//客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建中介者  
        Mediator mediator = new ConcreteMediator();

        // 创建并注册同事对象  
        Colleague colleagueA = new ColleagueA(mediator);
        Colleague colleagueB = new ColleagueB(mediator); // 假设ColleagueB是另一个同事实现  

        // 同事A发送消息  
        colleagueA.send("Hello, everyone from ColleagueA!");

        // 同事B也可以发送消息(如果需要)  
        colleagueB.send("Hello, everyone from ColleagueB!");
    }
}  

/* Output:
ColleagueB received: Hello, everyone from ColleagueA!
ColleagueA received: Hello, everyone from ColleagueB!
*///~
  

在这个例子中,ConcreteMediator 是具体的中介者类,它负责维护同事对象的列表,并协调它们之间的通信。ColleagueAColleagueB 是具体的同事类,它们通过中介者来发送和接收消息。在客户端代码中,我们创建了中介者和两个同事对象,并将它们注册到中介者中。然后,我们让 ColleagueA 发送一条消息,这条消息将通过中介者转发给所有其他同事(在这个例子中是 ColleagueB)。

中介者模式的应用

中介者模式是一种行为型设计模式,它允许多个对象之间通过一个中介者对象进行通信和协作。这种设计模式通常用于处理多个对象之间的复杂交互关系,以简化系统结构并提高可维护性。

在现实生活中,我们可以将机场的塔台视为一个中介者模式的例子。塔台作为中介者,负责协调不同飞机(对象)之间的起飞和降落,飞机之间无需直接相互通信,而是通过塔台进行交流。

优点

  1. 降低系统复杂性:通过将对象间的交互逻辑集中到一个中介者对象中,降低了对象间的直接耦合度,从而简化了系统结构。例如,在聊天室场景中,如果有8个人需要相互通信,使用中介者模式后,每个人只需要与中介者(聊天室)进行交互,而不是与其他7个人分别交互,大大降低了交互的复杂性。
  2. 提高可扩展性:当系统需要添加新的交互行为时,只需要修改或扩展中介者对象,而无需修改其他对象,从而提高了系统的可扩展性。
  3. 促进松散耦合:由于对象之间不再直接相互依赖,而是通过中介者进行交互,因此对象之间的耦合度大大降低,使得系统更加易于理解和维护。

缺点

  1. 中介者对象可能变得复杂:随着系统中对象数量的增加,中介者对象可能需要处理更多的交互逻辑,这可能导致中介者对象变得庞大而复杂,难以维护。
  2. 过度依赖中介者:由于所有对象都通过中介者进行交互,因此如果中介者出现故障或性能瓶颈,整个系统可能会受到影响。

使用场景

  1. 对象间存在复杂的引用关系:当系统中多个对象之间存在复杂的引用关系,导致系统结构混乱、难以理解时,可以使用中介者模式来简化这些关系。
  2. 需要集中控制交互行为:当一组对象之间的交互行为需要进行集中控制时,可以使用中介者模式来维护和管理这些交互行为。
  3. 多人协作场景:例如多人聊天室、多人游戏等场景,其中每个人都需要与其他人进行交互,使用中介者模式可以简化这些交互过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【区块链】解码拜占庭将军问题:区块链共识机制的哲学基石

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 解码拜占庭将军问题&#xff1a;区块链共识机制的哲学基石引言一、拜占庭将军问…

微软云计算[2]之微软云关系数据库SQL Azure

微软云关系数据库SQL Azure SQL Azure概述SQL Azure关键技术SQL Azure数据库SQL Azure报表服务SQL Azure数据同步 SQL Azure和SQL Server对比 SQL Azure概述 SQL Azure是微软的云中关系型数据库。 SQL Azure数据库简化了多数据库的供应和部署。 SQL Azure还为用户提供内置的高…

meilisearch的Managing API keys,自己趟过的坑

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

graphpad加截断线 更改图表类型

1. 双击图表进入 2.设置最大值和最小值 设置的时候先设置bottom再设置top&#xff0c;否则改变不成功&#xff01;&#xff01; 3.设置坐标轴间隔 4. 更改图表类型

金融上云及信创改造过程中的新老设备兼容性、虚拟化多池管理简化、提升故障恢复能力等问题及解决方案|金融行业数字化QA合集②

Q&#xff1a;金融机构如何解决新老设备间的兼容性问题&#xff1f; 我行在虚拟化资源池扩容时&#xff0c;新采购的服务器与原有的服务器存在代差&#xff0c;容易出现新服务器的CPU架构与原有服务器不同&#xff0c;可能导致虚拟机迁移或运行时的性能问题或不兼容&#xff1…

AutoKG:为语言模型打造高效自动化知识图谱

在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如BERT、RoBERTa、T5和PaLM等&#xff0c;以其在自然语言处理&#xff08;NLP&#xff09;任务中的卓越性能而著称。然而&#xff0c;这些模型在提供信息时可能会产生“幻觉”&#xff0c;即提供看似合理但…

【UE数字孪生学习笔记】 虚幻日志系统

声明&#xff1a;部分内容来自于b站&#xff0c;知乎&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 虚幻日志系统 1. 日志是一种非常实用的调试工具&#xff0c;可以详细…

国内首家!悦数图数据库全项完成中国信通院图数据库性能测试

大数据时代&#xff0c;随着各种社交网络、系统推荐等业务需求的不断发展&#xff0c;数据间的依赖和复杂度的逐渐增加&#xff0c;传统关系型数据库对这些需求捉襟见肘&#xff0c;图数据库应运而生。图数据库在金融风控、知识图谱、关系分析等应用场景的关联查询上有着明显优…

自带红外码库可使用蓝牙小程序控制的离线语音万能红外遥控器

离线语音蓝牙红外模块简介 此蓝牙红外模块是一种低成本的离线语音单麦应用方案&#xff0c;主芯片是一颗专用于语音处理的人工智能芯片&#xff0c;可广泛应用于家电&#xff0c;家居&#xff0c;音箱&#xff0c;玩具&#xff0c;穿戴设备&#xff0c;汽车等产品领域&#xf…

餐饮行业可燃气体报警器计量校准,惠州博罗引领安全新趋势

在惠州博罗这片繁荣的土地上&#xff0c;餐饮行业作为城市经济的重要组成部分&#xff0c;其安全问题一直备受关注。 可燃气体报警器作为餐饮场所预防火灾和爆炸事故的关键设备&#xff0c;其准确性和可靠性至关重要。 在这篇文章中&#xff0c;佰德将通过实际案例和数据&…

基本元器件 - 光电耦合器

光耦是将发光二极管&#xff08;LED&#xff09;和光电探测器集成于一个封装中的器件。 光耦的作用 在光耦中&#xff0c;一次侧&#xff08;LED 侧&#xff09;和二次侧&#xff08;受光器件侧&#xff09;是电绝缘的。因此&#xff0c;即使一次侧和二次侧的电位&#xff08;…

epy - 终端电子书阅读器(epub2、epub3、fb2、mobi)

文章目录 一、关于 epy二、安装epy manual 三、用法四、颜色配置文件五、使用Epy的阅读技巧六、配置文件七、网址支持八、使用鼠标九、文字转语音十、字典十一、Double Spread 一、关于 epy 终端 电子书&#xff08;epub2、epub3、fb2、mobi&#xff09;阅读器 github : http…

力扣每日一题 6/12 + 随机一题

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2806.取整够买后的账户余额【简单】 题目&#xff1a; 一开始&#xff0c;你…

算法课程笔记——蓝桥第17次直播云课

算法课程笔记——蓝桥第17次直播云课 递归 改成signed&#xff0c;把所有int 改成longlong 100会越界

Linux - 信号阻塞 信号捕捉

Linux - 信号阻塞 & 信号捕捉 信号阻塞信号集操作信号集sigporcmasksigpendingsigaction 信号捕捉用户态与内核态信号捕捉的时机 在博客[Linux - 信号概念 & 信号产生]中&#xff0c;我讲解了信号的基本概念&#xff0c;以及信号是如何产生的&#xff0c;本博客将继续讲…

IPTV,OTT,DVB有线数字电视

当我们买了一台电视回家&#xff0c;满心欢喜的打开&#xff0c;准备收看最新节目的时候&#xff0c;却发现没办法看直播&#xff0c;这个时候去广电办理业务&#xff0c;IPTV&#xff0c;OTT&#xff0c;DTV有线数字电视等这种词语整的眼花缭乱&#xff0c;那么今天我们来解释…

计算机网络 期末复习(谢希仁版本)第4章

路由器&#xff1a;查找转发表&#xff0c;转发分组。 IP网的意义&#xff1a;当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互连的各具体的网络异构细节。如果在这种覆盖全球的 IP 网的上层使用 TCP 协议&#xff0c;那么就…

【FreeRTOS】源码概述

FreeRTOS源码概述 参考《FreeRTOS入门与工程实践(基于DshanMCU-103)》里《第7章 FreeRTOS源码概述》 相关文章&#xff1a;http://t.csdnimg.cn/QK0aO 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c; FreeRTOS 相关的源码如下: 主要设计两个目录 C…

【教程】从0开始搭建大语言模型:实现Attention机制

从0开始搭建大语言模型 从0开始搭建大语言模型&#xff1a;实现Attention机制建模长序列存在的问题使用attention机制获得数据间的依赖Self-attention介绍带有可训练权重的self-attention1.生成Q&#xff0c;K&#xff0c;V变量2.计算attention score3.attention weight的获得4…

PS2045L-ASEMI低Low VF肖特基PS2045L

编辑&#xff1a;ll PS2045L-ASEMI低Low VF肖特基PS2045L 型号&#xff1a;PS2045L 品牌&#xff1a;ASEMI 封装&#xff1a;TO-277 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;45V 最大…