行为型设计模式之Mediator(中介者)

news2025/6/9 5:10:16

行为型设计模式之Mediator(中介者)

1)意图

用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

2)结构

在这里插入图片描述

其中:

  • Mediator (中介者)定义一个接口用于各同事(Colleague)对象通信。
  • ConcreteMediator (具体中介者)通过协调各同事对象实现协作行为;了解并维护它的
    各个同事。
  • Colleague class (同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事
    通信的时候与它的中介者通信。

3)适用性

Mediator 模式适用于:

  • 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系混乱难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
/**
 * @author psd 行为设计模式之中介者模式
 * 1.  定义一个中介者类,使各同事类对象之间可以相互通信,且不需知道通信的细节。【发给除发送方所有的同事】
 * 2.  定义同事类,实现中介者类所定义的抽象方法,并持有中介者对象。【发送消息】
 * 3.  定义抽象中介者类,定义同事类对象之间的通信方法。【接收消息】
 */
public class MediatorDemo {
    public static void main(String[] args) {
        // 1.  创建中介者对象
        Concremediator concremediator = new Concremediator();
        // 2.创建各个同事对象
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concremediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concremediator);

        concremediator.setColleague1(concreteColleague1);
        concremediator.setColleague2(concreteColleague2);

        concreteColleague1.sendMessage("南哥是否收到?我是宿州");
        concreteColleague2.sendMessage("我已收到over,马上给你通地铁");

    }
}

/**
 * 抽象同事类
 */
abstract class Colleague{
    protected Mediator mediator;
}

/**
 * 同事1
 */
class ConcreteColleague1 extends Colleague{
    public ConcreteColleague1(Mediator mediator) {
        this.mediator = mediator;
    }
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    public void receiveMessage(String message) {
        System.out.println("宿州 收到信息:" + message);
    }
}

/**
 * 同事2
 */
class ConcreteColleague2 extends Colleague{
    public ConcreteColleague2(Mediator mediator) {
        this.mediator = mediator;
    }
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    public void receiveMessage(String message) {
        System.out.println("南京 收到信息:" + message);
    }
}

/**
 * 中介者抽象类
 */
abstract class Mediator{
    public abstract void sendMessage(String message, Colleague colleague);
}

class Concremediator extends Mediator{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public void setColleague1(ConcreteColleague1 colleague1) {
        this.colleague1 = colleague1;
    }

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

    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleague1){
            // 同事2 接收到消息
            colleague2.receiveMessage(message);
        } else {
            // 同事1 接收到消息
            colleague1.receiveMessage(message);
        }
    }
}

4.经典应用案例:

1. GUI界面组件交互

场景:表单包含按钮、输入框、下拉菜单等组件,点击按钮需禁用输入框,选择下拉项需更新文本框。
问题:若组件直接相互调用,会形成复杂的网状依赖。
中介者方案:

创建 FormMediator 作为中介者,所有组件通过它通信。

组件事件触发时通知中介者,由中介者调用其他组件的方法。
优势:添加新组件时,只需修改中介者,无需改动现有组件。

2. 聊天室系统(消息中转)

场景:多个用户需要互相发送消息。
问题:用户间直接引用会导致耦合(如 userA.sendMsg(userB, “hello”))。
中介者方案:

引入 ChatServer 作为中介者,用户只与服务器通信。

用户调用 chatServer.sendMessage(sender, receiver, msg),由服务器转发。
优势:新增用户时,发送方无需知道所有接收方的存在。

3. 航空管制系统

场景:多架飞机需协调起飞/降落,避免跑道冲突。
问题:飞机间直接通信会导致混乱和安全隐患。
中介者方案:

ControlTower(控制塔)作为中介者,接收飞机的请求,分配跑道并广播状态。

飞机只需向控制塔发送请求,无需与其他飞机交互。
优势:统一管理安全规则,避免资源竞争。

4. 工作流引擎

场景:审批流程涉及多个部门(财务、法务、HR),步骤需按条件流转。
问题:部门间直接调用会导致流程逻辑分散。
中介者方案:

定义 WorkflowEngine 作为中介者,根据当前状态触发下一环节。

部门完成任务后通知引擎,引擎决定下一步执行哪个部门。
优势:流程规则集中维护,部门间无直接依赖。

何时避免使用中介者模式?

交互逻辑简单:对象间只有少量直接通信,引入中介者反而增加复杂度。

中介者成为“上帝对象”:当中介者过度膨胀,承担过多职责时,需考虑拆分。

性能敏感场景:中介者可能成为瓶颈(如高频实时通信)。

模式优势:
降低耦合:对象只需依赖中介者,而非多个其他对象。

简化维护:交互逻辑集中在中介者中,修改更安全。

复用组件:组件不再依赖具体对象,更易独立复用。

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…

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

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

相关文章

三维图形、地理空间、激光点云渲染技术术语解析笔记

三维图形、地理空间、激光点云渲染技术术语解析笔记 code review! 文章目录 三维图形、地理空间、激光点云渲染技术术语解析笔记1. Minecraft风格的方块渲染2. Meshing(网格化)3. Mipmapping(多级纹理映射)4. Marching Cubes&…

从webrtc到janus简介

1.基础知识 1.1 信令的基础知识 在 WebRTC(Web Real-Time Communication) 中,信令(Signaling) 是实现浏览器之间实时通信的关键机制,负责在通信双方(或多方)之间传递控制信息&…

JVM 核心概念深度解析

最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆 一、JVM内存结构/运行时数据区 JVM运行时数据区主要分为以下几个部分: 程序计数器(PC Register) 线程私有,记录当前线程执行的字节码行号唯…

api将token设置为环境变量

右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作,通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…

SIFT算法详细原理与应用

SIFT算法详细原理与应用 1 SIFT算法由来 1.1 什么是 SIFT? SIFT,全称为 Scale-Invariant Feature Transform(尺度不变特征变换),是一种用于图像特征检测和描述的经典算法。它通过提取图像中的局部关键点,…

AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量

AlphaDrive: Unleashing the Power of VLMs in Autonomous Driving via Reinforcement Learning and Reasoning 25年3月来自华中科技大学和地平线的论文 OpenAI 的 o1 和 DeepSeek R1 在数学和科学等复杂领域达到甚至超越了人类专家水平,其中强化学习(R…

【八股消消乐】如何解决SQL线上死锁事故

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色

原文:如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色 | w3cschool笔记 (请勿标记为付费!!!!) 在网页开发中,为图片添加动态效果可以显著提升用户体验。今天,我将向…

CAN通信收发测试(USB2CAN模块测试实验)

1.搭建测试环境 电脑:安装 USB 驱动,安装原厂调试工具,安装cangaroo(参考安装包的入门教程即可) USB驱动路径:~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径:~\CAN分析仪资料2…

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤

一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载

MinerU发布至今我已经更新多版整合包了,5天前MinerU发布了第一个正式版1.0.1,并且看到在18小时之前有更新模型文件,我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…

【深入学习Linux】System V共享内存

目录 前言 一、共享内存是什么? 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1)key与shmid的区别与联系 2)再理解key 3)通过指令查看/释放系统中…

编程基础:执行流

能帮到你的话,就给个赞吧 😘 文章目录 执行流同步:顺序执行,只有一个执行流异步:新开后台(次)执行流,后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞:任务阻塞执行流,导致…

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用

作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…

2025年6月6日第一轮

2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入

一、Oracle 23ai Vector Embeddings 核心概念​ 向量嵌入(Vector Embeddings)​​ -- 将非结构化数据(文本/图像)转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例:"数据库" → [0.24, -0.78, 0.5…

pytorch 与 张量的处理

系列文章目录 文章目录 系列文章目录一、Tensor 的裁剪二、Tensor 的索引与数据筛选torch.wheretorch.indicestorch.gathertorch.masked_selecttorch.taketorch.nonzero(省略) 三、Tensor 的组合与拼接torch.cattorch.stack 四、Tensor的切片chunksplit …

layer norm和 rms norm 对比

Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点: 减去均值(去中心化)除以标准差(标准化)包含可学习参数 …