小谈设计模式(26)—中介者模式

news2025/6/27 5:15:22

小谈设计模式(26)—中介者模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 中介者模式
    • 分析
    • 角色分析
      • 抽象中介者(Mediator)
      • 具体中介者(ConcreteMediator)
      • 抽象同事类(Colleague)
      • 具体同事类(ConcreteColleague)
    • 工作过程
    • 优缺点分析
      • 优点分析
        • 1
        • 2
      • 缺点分析
        • 1
        • 2
    • 适用场景
      • 1
      • 2
    • Java程序分析
      • 分析
        • 1
        • 2
        • 3
      • 输出结果
    • 总结

专栏介绍

专栏地址

http://t.csdnimg.cn/VpriY

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象之间的通信封装到一个中介者对象中,从而实现对象之间的松耦合。中介者模式可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。

分析

在中介者模式中,存在一个中介者对象,它封装了对象之间的通信逻辑。对象之间的通信不再直接发生,而是通过中介者对象进行。当一个对象需要与其他对象进行通信时,它不需要知道其他对象的具体细节,只需要与中介者进行交互即可。
在这里插入图片描述

角色分析

抽象中介者(Mediator)

定义了中介者对象的接口,它通常包含一个或多个抽象的通信方法,用于定义对象之间的通信规则。

具体中介者(ConcreteMediator)

实现了抽象中介者的接口,它通过协调各个同事对象来实现协作行为。

抽象同事类(Colleague)

定义了同事对象的接口,它通常包含一个中介者对象的引用,用于与中介者进行通信。

具体同事类(ConcreteColleague)

实现了抽象同事类的接口,它与其他同事对象通过中介者进行通信。
在这里插入图片描述

工作过程

各个同事对象将自己的引用传递给中介者对象,以便中介者对象能够与各个同事对象进行通信。
当一个同事对象需要与其他同事对象进行通信时,它将请求发送给中介者对象。
中介者对象接收到请求后,根据通信规则进行相应的处理,并将请求转发给目标同事对象。
目标同事对象接收到请求后,进行相应的处理。
在这里插入图片描述

优缺点分析

优点分析

1

减少了对象之间的直接依赖,提高了系统的灵活性和可维护性。

2

将对象之间的通信集中到一个中介者对象中,使得系统结构更加清晰。

缺点分析

1

中介者对象将承担较多的责任,可能会变得复杂。

2

如果中介者对象存在过多的逻辑,可能会影响系统的性能。
在这里插入图片描述

适用场景

1

当对象之间存在复杂的通信逻辑时,可以使用中介者模式将通信逻辑集中到一个中介者对象中。

2

当对象之间的通信关系呈现网状结构时,可以使用中介者模式将通信关系简化为星型结构。
在这里插入图片描述

Java程序分析

// 抽象中介者
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

// 具体中介者
class ConcreteMediator implements Mediator {
    private Colleague colleague1;
    private Colleague colleague2;

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

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

    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receiveMessage(message);
        } else if (colleague == colleague2) {
            colleague1.receiveMessage(message);
        }
    }
}

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

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void sendMessage(String message);
    public abstract void receiveMessage(String message);
}

// 具体同事类
class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

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

// 具体同事类
class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

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

// 测试类
public class MediatorPatternExample {
    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.sendMessage("Hello from colleague1");
        colleague2.sendMessage("Hi from colleague2");
    }
}

分析

1

在上述示例中,Mediator是抽象中介者接口,定义了中介者对象的通信方法。ConcreteMediator是具体中介者类,实现了抽象中介者接口,并通过协调各个同事对象来实现协作行为。

2

Colleague是抽象同事类,定义了同事对象的接口,并包含一个中介者对象的引用,用于与中介者进行通信。ConcreteColleague1和ConcreteColleague2是具体同事类,分别实现了抽象同事类的接口。

3

在测试类MediatorPatternExample中,创建了具体中介者对象和具体同事对象,并将同事对象的引用传递给中介者对象。然后,通过同事对象调用sendMessage方法发送消息,中介者对象根据通信规则进行处理,并将消息转发给目标同事对象。最后,目标同事对象接收到消息并进行处理。

输出结果

ConcreteColleague2 received message: Hello from colleague1
ConcreteColleague1 received message: Hi from colleague2
以上示例演示了中介者模式的基本实现,通过中介者对象实现了对象之间的松耦合,实现了对象之间的通信。

总结

总结起来,中介者模式通过将对象之间的通信封装到一个中介者对象中,实现了对象之间的松耦合。它可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。中介者模式适用于对象之间存在复杂的通信逻辑或通信关系呈现网状结构的场景。

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

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

相关文章

# Spring Cloud的新潮流:服务网格与无缝通信

文章目录 微服务通信的挑战引入服务网格Spring Cloud和服务网格的融合Envoy与Spring Cloud的集成服务网格的可观察性 服务网格的安全性无缝的微服务通信结语 🎉欢迎来到架构设计专栏~# Spring Cloud的新潮流:服务网格与无缝通信 ☆* o(≧▽≦)o *☆嗨~我…

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分:边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分:应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分:挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

大数据之力:从数据湖到数据智能的升级之路

文章目录 什么是数据湖?什么是数据智能?数据湖与数据智能的结合实现数据湖和数据智能的关键技术挑战和未来展望结论 🎉欢迎来到AIGC人工智能专栏~大数据之力:从数据湖到数据智能的升级之路 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#…

常用burpsuite渗透插件

burpsuite_plugin 个人常用burpsuite渗透插件,根据常用系列插件为: 1.TsojanScan 2.RouteVulScan 3.BurpJSLinkFinderv2 大大提高渗透测试存在某些难以发现的接口未授权,SQL注入等,用了之后腰也不疼了,脑子又长了…

2023年八款优质替代Microsoft Project的选择(免费和付费)

过去,许多公司在没有预算或预算紧张的情况下都依赖MicrosoftProject来进行项目资源规划。然而许多用户期望从他们的商业软件中获得的许多最先进的项目管理功能但Microsoft工具并没有提供。小公司如何平衡预算现实与软件需求? 项目管理软件领域已经飞速发…

信号功率谱密度理解及其与频谱和能量谱的区别

信号功率谱密度理解及其与频谱和能量谱的区别 一、功率谱密度的特点 信号的功率谱密度函数是指这样的频率函数: (1)在整个频率范围内对它进行积分后,就能得到信号的总功率; (2)它描述了信号功…

Open CV 3D Python 环境搭建

1、安装Windows-Python环境 下载exe 并安装 https://python.p2hp.com/downloads/windows/index.html 安装路径随意, 基本一路默认,下一步、下一步 注意有个钩:添加到环境变量 检测是否成功安装Python 环境 CMD输入python 2、安装OpenCV -Python 包来自清华大学…

Java架构师概要设计

目录 1 导学2 概要设计之任务和方法2.1 继续架构设计2.2 继续技术选型2.3 确定技术栈2.4 架构原型实现与验证2.5 技术预研2.6 分服务分模块2.7 初步设计应用基础框架2.8 定义基本API2.9 定义实体对象2.10 定义数据库表结构3 构建项目工程和环境4 代码组件的关系5 总结1 导学 本…

COCO数据集中图像的caption读取到txt文件

annotations_trainval2017.zip import os import shutil import jsoncaptions_path r"G:\SketchDiffusion\Sketchycoco\Dataset\annotations\captions_train2017.json" # 读取json文件 with open(captions_path, r) as f1:dictortary json.load(f1)# 得到images和…

C语言,指针的一些运算

若创建一个数组:int arr[10] 0; 用指针变量来储存数组首元素的地址:int* p arr,这里arr是数组名,表示首元素地址。 若p p 1或者p之后p本来指向数组首元素地址,就变成了指向第二个元素的地址,p n即指向第n 1个地…

PyTorch 深度学习之处理多维特征的输入Multiple Dimension Input(六)

1.Multiple Dimension Logistic Regression Model 1.1 Mini-Batch (N samples) 8D->1D 8D->2D 8D->6D 1.2 Neural Network 学习能力太好也不行(学习到的是数据集中的噪声),最好的是要泛化能力,超参数尝试 Example, Arti…

sql case when用法

文章目录 学习链接SQL之CASE WHEN用法详解简单CASE WHEN函数CASE WHEN条件表达式函数常用场景场景1:简单条件使用场景2:多目标字段统计场景3:经典行转列,并配合聚合函数做统计场景4:CASE WHEN中使用子查询场景5&#x…

【大数据】HDFS概述(学习笔记)

一、文件系统、分布式文件系统 1、传统文件系统 文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作。 文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念。 数据:指存储的内容本身。这些数据…

前端发展趋势:WebAssembly、PWA 和响应式设计

文章目录 WebAssembly:超越JavaScript的性能渐进式Web应用(PWA):离线可用和更好的用户体验响应式设计:适应多种设备总结延伸阅读 🎉欢迎来到Java学习路线专栏~前端发展趋势:WebAssembly、PWA 和…

文本情感计算技术(深度)

文本情感计算技术的发展得益于社交媒体的蓬勃发展。文本情感计算的研究至今已有 20年的历史,仍是国内外学术界和产业界的研究热点。随着新技术的变迁、新任务的出现,以及更高性能算法需求的增长,文本情感计算涉及多项有挑战性的研究任务。文本…

git rebase与git merge图文详解(一文看懂区别)

git rebase与git merge图文详解 大家在工作中团队开发的时候对于拉取分支和合并代码时就会涉及到两种选择,git rebase与git merge: rebase:变基,会有一个干净的分支,但是对于记录来源不够清晰merge:合并&am…

有未经处理的异常: 0xC00000FD: Stack overflow 问题解决

Visual Studio 调试运行程序时出现xxx处有未经处理的异常(在 yyy.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000015C203000) 报错 解决方法如下: 在属性 > 配置属性 > 链接器 > 系统 > 堆栈保留大小及堆栈提交大小&#…

C语言,标志法

标志法通常用来检查或者进行过程中一些状态变化。 有一些是为了观察变化&#xff0c;举出一些以往代码的例子&#xff1a; 1.找出一串数字中没有重复出现过的数字 #include <stdio.h> int main() {int arr[1000] { 0 };int n 0;scanf("%d", &n);int i…

布局--QT Designer

一、在我们使用Qt做界面设计时&#xff0c;为了界面的整洁美观&#xff0c;往往需要对界面中的所有控件做一个有序的排列&#xff0c;以及设置各个控件之间的间距等等&#xff0c;为此Qt为界面设计提供了基本布局功能&#xff0c;使用基本布局可以使组件有规则地分布。 1.1 基…

项目管理的优秀软件推荐,助力提升团队效能!

我们知道&#xff0c;每个产品在上市的过程中都需要经历市场调研、研发设计、功能测试、上市评估、营销推广等阶段。作为项目经理&#xff0c;最关键的任务不仅是确保产品的顺利孵化和上市&#xff0c;还有管理团队。我们研究了许多项目管理用户&#xff0c;工作的难点是如何在…