Java设计模式 二十一 中介者模式 (Mediator Pattern)

【Java设计模式】Java设计模式之(十)中介者模式(Mediator Pattern) 所有设计模式的代码实现例子都可在码云上查看哦,感兴趣的可以查看哈,码云地址:https://gitee.com/no8g/java-design-patterns 阅读详情

中介者模式 (Mediator Pattern)

中介者模式是一种行为型设计模式,它用于降低多个对象和类之间的通信复杂性。中介者模式通过引入一个中介者对象,使得原本直接通信的对象不再相互直接交互,而是通过中介者来进行协调和通信。这样,所有对象只需要与中介者对象交互,而不再直接依赖于其他对象。中介者模式的关键思想是:通过一个中介者对象来集中管理和协调各个对象之间的交互,避免了对象之间的直接耦合。


1. 中介者模式的组成

中介者模式通常包含以下几个角色:

  • Mediator(中介者接口):定义了与各个同事类(Colleague)交互的接口。中介者通常负责协调不同同事类之间的通信。
  • ConcreteMediator(具体中介者):实现了Mediator接口,并协调不同的同事类(Colleague)之间的交互。具体中介者持有所有同事类的引用,并通过这些引用来调度相关操作。
  • Colleague(同事类):每个同事类都知道中介者的存在,并通过中介者与其他同事类交互。每个同事类通常会将自己的一些操作委托给中介者来处理。

2. 中介者模式的工作流程

  1. 各个同事类(Colleague)在需要与其他同事类交互时,并不直接交互,而是通过中介者来完成。
  2. 中介者接收到同事类的请求后,协调其他同事类的行为或通知其他相关同事类。
  3. 同事类之间的交互通过中介者来管理,从而减少了同事类之间的直接耦合,使得系统更加灵活和可维护。

3. 中介者模式的实现

场景示例:聊天系统

假设我们设计一个简单的聊天系统,其中有多个用户,每个用户都可以发送消息给其他用户,但我们不希望每个用户直接与其他用户进行通信,而是通过一个中介者来协调消息的发送和接收。我们可以使用中介者模式来实现这一功能。


1) 定义中介者接口

Mediator接口定义了与同事类交互的方法。

// 中介者接口
public interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

2) 定义同事类接口

Colleague类是一个抽象类,表示系统中的每个用户。

// 同事类接口
public abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void receiveMessage(String message);
}

3) 定义具体的同事类

User类表示具体的聊天用户,每个用户都可以发送和接收消息。

// 具体同事类:用户
public class User extends Colleague {

    private String name;

    public User(Mediator mediator, String name) {
        super(mediator);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " 收到消息: " + message);
    }

    public void sendMessage(String message) {
        System.out.println(name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }
}

4) 定义具体的中介者类

ChatRoom类是具体的中介者,它负责协调不同用户之间的消息传递。

// 具体中介者类:聊天室
public class ChatRoom implements Mediator {

    private List<Colleague> colleagues;

    public ChatRoom() {
        colleagues = new ArrayList<>();
    }

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            if (c != colleague) {
                c.receiveMessage(message);
            }
        }
    }
}

5) 客户端代码

客户端代码创建多个用户,并通过聊天室中介者来发送和接收消息。

public class Client {
    public static void main(String[] args) {
        // 创建中介者(聊天室)
        ChatRoom chatRoom = new ChatRoom();

        // 创建用户,并将他们加入聊天室
        User user1 = new User(chatRoom, "张三");
        User user2 = new User(chatRoom, "李四");
        User user3 = new User(chatRoom, "王五");

        chatRoom.addColleague(user1);
        chatRoom.addColleague(user2);
        chatRoom.addColleague(user3);

        // 用户发送消息
        user1.sendMessage("大家好!");

        // 另一位用户发送消息
        user2.sendMessage("你好,张三!");
    }
}

运行结果:
张三 发送消息: 大家好!
李四 收到消息: 大家好!
王五 收到消息: 大家好!
李四 发送消息: 你好,张三!
张三 收到消息: 你好,张三!
王五 收到消息: 你好,张三!

4. 中介者模式的优点

  1. 减少类与类之间的依赖关系: 各个同事类之间不再直接通信,而是通过中介者来协调,从而减少了类之间的耦合性。
  2. 集中管理交互: 交互的逻辑都集中在中介者中,使得修改和维护变得更加简单。
  3. 更易扩展: 增加新的同事类时,只需要将新的同事类添加到中介者中,而不需要修改现有的类。
  4. 职责分离: 中介者模式将同事类的交互逻辑从业务逻辑中提取出来,职责更加清晰。

5. 中介者模式的缺点

  1. 中介者对象变得复杂: 随着同事类的增多,中介者对象需要处理的交互逻辑也会变得复杂,可能导致中介者类的过度膨胀。
  2. 潜在的性能问题: 由于所有通信都通过中介者进行,可能会引入性能瓶颈,尤其是在大量同事类间交互的场景下。
  3. 增加了额外的抽象层次: 引入中介者后,可能会增加系统的复杂度和抽象层次,导致代码的理解和维护成本提高。

6. 中介者模式的应用场景

  • GUI组件间的交互: 在复杂的图形界面中,不同的组件(如按钮、文本框等)需要相互协调,使用中介者模式可以避免它们之间的直接交互。
  • 系统中的消息中转: 比如在社交网络或聊天室中,消息的传递可以通过中介者来协调,减少直接耦合。
  • 工作流引擎: 在一些复杂的工作流或任务流中,各个模块之间需要进行协作,可以通过中介者模式来控制各个模块的交互。

7. 总结

中介者模式通过引入中介者对象,减少了系统中各个同事类之间的直接依赖,简化了类与类之间的交互。它使得系统更加灵活,可维护性更高。虽然中介者模式提高了系统的可扩展性,但也可能导致中介者本身变得复杂,因此需要合理使用,尤其是在交互较为复杂的系统中。

【愚公系列】二十三种设计模式(十七)-中介者模式(Mediator Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

TI AWR2944毫米波雷达开发板开箱:用官方Demo快速上手3D点云与热图生成

本文详细介绍了TI AWR2944毫米波雷达开发板的开箱与实战应用,包括硬件准备、软件开发环境搭建、Demo固件刷写与配置、实时可视化与数据解析等全流程指南。通过官方Demo快速上手3D点云与热图生成,帮助开发者高效掌握毫米波雷达技术在工业检测、智能交通等领域的应用。

weixin_42627853的博客 308

中介者模式(Mediator Pattern)详解

中介者模式是一种行为型设计模式,它通过一个中介对象来封装一系列对象之间的交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式是一种强大的设计模式,它通过集中控制对象之间的交互,大大降低了系统的耦合度。当系统中的对象之间存在复杂的引用关系时,中介者模式是一个很好的选择。将原本分散在多个对象间的交互逻辑集中起来,使系统更加容易维护将多对多的依赖关系变成一对多的依赖关系,降低了类与类之间的耦合使各个组件可以独立地变化和复用,不再相互依赖。

yk_dflkg的博客 1250

关键词‖旋变传感器

旋转变压器(以下简称旋变)安装在永磁同步驱动电机的非传动端,其作用是检测转子的位置和速度。目前,通常采采用结构简单、坚固耐用、环境适应性好的磁阻式旋变作为位置传感器。

m0_72345077的博客 2151

23种设计模式——中介者模式 (Mediator Pattern)详解

本文介绍了23种设计模式之——中介者模式 (Mediator Pattern)的说明及使用

Meteors.的博客 1193

基于 YOLO26 的车辆实时检测与计数系统

本文提出了一种基于YOLO26的车辆实时检测与计数系统。系统采用CSPDarknet53作为主干网络,结合特征金字塔和多尺度预测实现高精度车辆检测。通过DeepSORT算法进行目标跟踪,并统计车辆数量、行驶方向和交通流量。实验表明,该系统在保持实时性能的同时,检测精度达到92.3%,可有效应用于智能交通管理。系统采用Python实现,支持GPU加速,适用于多种交通场景下的车辆监测需求。

一键难忘的博客 907

分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

🔥 分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

XiaoqiangClub的博客 477

Java设计模式之中介者模式(Mediator Pattern)

中介者模式定义了一个中介对象来封装一系列对象之间的交互。这种模式使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在中介者模式中,中介者负责处理对象间的通信和协作,对象间不再直接交互,而是通过中介者来间接通信。

shiming8879的博客 964

【开发必备插件】iframe嵌套报“拒绝连接请求”的本地解决方法

关键词:iframe 拒绝连接、X-Frame-Options、Chrome 插件、前端调试、Allow X-Frame-Options前几天我在本地项目里调试一个第三方网站的嵌入页面时,遇到了一个非常经典的报错:xxx.com 拒绝了我们的连接请求。熟悉的老前端们一眼就知道——这是。但对于日常开发来说,我们经常需要在本地测试 iframe 嵌套外部页面(比如嵌第三方登录页、支付页、可视化报表系统等)。而线上站点配置了或DENY时,就会直接导致 iframe 加载失败。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1542

设计模式-15中介者模式Mediator Pattern

中介者模式摘要 中介者模式是一种行为型设计模式,通过引入中介对象来封装一组对象间的复杂交互。该模式降低了对象间的直接耦合,使它们只需与中介者通信,而不必相互引用。中介者模式适用于对象间交互复杂且难以维护的场景,能集中控制交互逻辑并避免产生过多依赖关系。典型实现包含Mediator接口、具体中介者类和同事类结构,其中中介者负责协调同事对象间的通信,同事类则通过中介者发送和接收消息。这种模式广泛应用于聊天室、GUI组件交互等系统设计中。

d3y1`5 81_09 1004

基于 Logistic 混沌映射和 Arnold 变换 的变换域水印改进算法【高级网络与信息安全技术-信息隐藏期末课程论文】

摘要:\textbf{摘要:}摘要:本文提出了一种新的水印算法是一种图像认证的新方法。算法首先使用Logistic混沌映射加密水印图像,然后使用Arnold变换置乱水印。同时改变了水印图像的像素位置和像素值,大大提高了算法的安全性。再使用DCT变换嵌入水印,并且结合人类视觉系统的特点来提升水印嵌入的透明性。实验结果表明,本文提出的水印算法可以大幅度提高水印嵌入的透明性与安全性的同时,并不降低算法的鲁棒性。注:完整的代码和论文在文末,百度网盘链接。

zik的博客 893

【蓝桥杯单片机组第八届省赛】— 基于单片机的电子钟程序设计与调试

1、初赛试题 1.1 基本要求 (1)使用 CT107D 单片机竞赛板, 完成“电子钟” 功能的程序设计与调试; (2)设计与调试过程中,可参考组委会提供的“资源数据包”; (3)Keil 工程文件以准考证号命名, 完成设计后, 提交完整、 可编译的 Keil工程文件到服务器。 1.2 硬件框图 1.3功能描述 1.3.1 初始化 (1)关闭蜂鸣器、继电器等无关外...

Fanjufei的博客 3661

JAVA设计模式之 中介者模式【Mediator Pattern】

一、概述     用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。 二、适用场景     协调多个对象之间的交互。 三、UML类图 四、参与者 1、Mediator(抽象中介者):它定义一个接口,该接口用于与各同

小吕丶Code阶区 5061

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

Java编程之中介者模式(Mediator Pattern)

摘要:中介者模式是一种行为型设计模式,通过中介对象协调多个组件间的通信,降低系统耦合度。以酒店前台为例,客人只需联系前台,由前台统一协调保洁、厨房、维修等部门,避免了直接交互的复杂性。UML结构图展示了中介者与各部门的星型关系,Java代码实现了酒店各部门通过前台中介的交互机制。该模式适用于GUI控件、聊天室等需要集中协调的场景,能有效简化对象间通信,提高系统灵活性和可维护性。

superfreeman的专栏 863

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Java教程】Day20-17 设计模式:行为型模式——中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)是一种行为型设计模式,旨在通过引入一个中介对象来封装多个对象的交互。它的主要作用是减少各个对象之间的直接引用,从而降低系统的耦合度,并使得对象间的交互变得更加灵活和简洁。

max202011161630的博客 903

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java设计模式 —— 【行为型模式】中介者模式(Mediator Pattern)详解

中介者模式是迪米特原则的经典体现:它要求一个对象应该对其他对象保持最少的了解。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

知唔猪的博客 1268

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

还是开个会议吧 - 中介者模式(Mediator Pattern)

如果在一个系统中,对象与对象之间的联系呈现出一种网状结构的时候,这就会导致系统非常复杂。而我们的中介者模式可以使得我们对象之间的关系大量减少。所有的对象都跟中介者进行沟通。这样的话,对象之间的关系就会出现从网状结构转化成星形结构,减少了对象之间的耦合度。降低耦合度:通过引入中介者,减少了对象之间直接的依赖关系,使得系统中的对象更加独立。集中化控制:所有的通信逻辑都集中在中介者中,这有助于管理和维护复杂的交互过程。易于扩展:新增加的同事对象只需要实现同事接口,并注册到中介者中即可,无需修改现有的代码。

Snow的博客 1556

Java设计模式——中介者模式【Mediator Pattern】

Java设计模式、中介者模式、Mediator Pattern

scorpio的博客 392

中介者模式-Mediator Pattern

如果在一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对 多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些 对象称为同事对象,它们之间通过彼此的相互作用实现系统的行为。在网状结构中,几乎每 个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的 直接耦合,这将导致一个过度耦合的系统。 如果把这种“网状结构”改为“星形结构”的话...

心猿意碼 4446

设计模式精讲 Day 17:中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它通过引入一个中介对象来封装一组对象之间的交互逻辑,使得这些对象无需直接相互引用,而是通过中介者进行通信。核心思想解耦对象之间的直接依赖,由中介者负责协调各对象之间的交互。本节详细介绍了中介者模式(Mediator Pattern),包括其定义、结构、适用场景、实现方式、工作原理、优缺点分析以及实际项目中的应用案例。通过学习该模式,读者可以理解如何在复杂的系统中降低对象之间的耦合度,提高系统的可维护性和扩展性。

在未来等你的专栏 1054

中介者模式 (Mediator Pattern)

行为型设计模式

qq_35861084的博客 1160

设计模式- 中介者模式(Mediator Pattern)结构|原理|优缺点|场景|示例

中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。中介者使各个对象不需要显式地相互引用,而是通过中介者进行间接通信,从而降低系统的复杂性和提高可维护性。

piaomiao_的博客 4331

中介者模式(Mediator pattern)

案例原型图说明及预览: 在工作中,开发(学生PAD)个人中心的时候,有一个效果图如下图1-1,在主界面中包含了5个子标签页,每个标签页是相互独立,但是有时需要进行通信。  以下有几点功能:      1、5个标签页都存在两种状态: ① 浏览状态  ② 编辑状态      2、点击某个标签页:           ① 标签移至界面中间           ② 被点击的标签页

906

设计模式学习--19.中介者模式(Mediator Pattern)

package com.designepattern.mediatorpattern.v2; import java.util.ArrayList; import java.util.List; /** * @Author:glx * @Date:2020/12/10 * @Content: */ public class MainDemo { public static void main(String[] args) { Person p1=new Pe...

u010031813的博客 189

设计模式-中介者模式(Mediator Pattern)

中介者模式 定义 中介者模式又称为调停者模式,用一个中介者来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少类之间的依赖,从而使其耦合松散,而且可以独立地改变它们之间的交互。 类型 行为型。 例子 慕课网的每门实战课程都有相应的交流群,里面有很多学员,学员可以在里面讨论问题,这个交流群其实就是一个中介者,是所有学员相互交流的一个中介者,我们先不考虑所有学员都能收到交流群更新的消息(可...

kaven 1358
上一篇: Java设计模式 二十 模板方法模式 (Template Method Pattern)
下一篇: Java设计模式 二十二 迭代器模式 (Iterator Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8359粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值