中介者模式的学习与使用

news2024/10/6 12:29:00

1、中介者模式的学习

  中介者模式是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合,使得它们可以独立地进行通信,而不需要直接相互引用。
  在中介者模式中,有以下几个角色:

  • Mediator(中介者):定义了对象之间的通信接口,提供了注册、转发和通知等方法,可以协调不同对象之间的交互。
  • ConcreteMediator(具体中介者):实现了中介者接口,负责协调具体的对象之间的交互。它通常会维护一个对象的集合,用于管理对象之间的通信。
  • Colleague(同事):定义了对象之间的通信接口,通常包含一个send()方法用于发送消息,以及一个receive()方法用于接收消息。
  • ConcreteColleague(具体同事):实现了同事接口,负责向中介者发送和接收消息。

  中介者模式的核心思想是将对象之间的交互逻辑集中在中介者中,而不是让每个对象都直接与其他对象通信。当一个对象需要与其他对象进行通信时,它只需要通过中介者发送消息,而无需知道具体的目标对象。中介者负责将消息转发给合适的目标对象。
在这里插入图片描述

2、中介者模式的使用

  假设有一个聊天室程序,其中包含多个用户(User)和一个中介者(Mediator)。用户可以发送消息给其他用户,并接收其他用户发送的消息。中介者负责将用户发送的消息广播给所有其他用户。
抽象中介者

public interface Mediator {

    /**
     * 消息广播
     *
     * @param user
     * @param message
     */
    void messageBroadCasting(User user, String message);
}

具体中介者

public class MediatorImpl implements Mediator {

    private List<User> userList = Lists.newArrayList();

    public void registerUser(User user) {
        userList.add(user);
    }

    @Override
    public void messageBroadCasting(User user, String message) {
        userList.stream().filter(x -> x != user).forEach(m -> m.receiveMessage(message));
    }
}

抽象同事

public interface User {

    /**
     * 发送消息
     *
     * @param message
     */
    void sendMessage(String message);

    /**
     * 接收消息
     *
     * @param message
     */
    void receiveMessage(String message);
}

具体同事

public class FirstUserImpl implements User {

    private Mediator mediator;

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

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

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}
public class SecondUserImpl implements User {

    private Mediator mediator;

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

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

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}
public class ThirdUserImpl implements User {
    private Mediator mediator;

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

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

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}

客户端

public class UserClient {

    public static void main(String[] args) {
        MediatorImpl mediator = new MediatorImpl();

        User firstUser = new FirstUserImpl(mediator);
        mediator.registerUser(firstUser);

        User secondUser = new SecondUserImpl(mediator);
        mediator.registerUser(secondUser);

        User thirdUser = new ThirdUserImpl(mediator);
        mediator.registerUser(thirdUser);

        firstUser.sendMessage("我是第一个用户,这是我发的消息");
        secondUser.sendMessage("我是第二个用户,我收到了一条新消息");
        thirdUser.sendMessage("我是第三个用户,我收到了一条新消息");
    }

}
SecondUserImpl接收到:我是第一个用户,这是我发的消息
ThirdUserImpl接收到:我是第一个用户,这是我发的消息
FirstUserImpl接收到:我是第二个用户,我收到了一条新消息
ThirdUserImpl接收到:我是第二个用户,我收到了一条新消息
FirstUserImpl接收到:我是第三个用户,我收到了一条新消息
SecondUserImpl接收到:我是第三个用户,我收到了一条新消息

3、总结

  中介者模式的优点包括:

  • 解耦了对象之间的交互关系,使得对象之间的通信更加灵活和可扩展。
  • 降低了对象之间的复杂性,每个对象只需要关注自身的业务逻辑。
  • 可以简化对象的维护和调试,由于对象之间的交互逻辑集中在中介者中,可以更方便地追踪和调试问题。

然而,中介者模式也有一些限制和注意事项:

  • 中介者对象会变得复杂,因为它需要管理多个对象之间的交互。
  • 过度使用中介者模式可能会导致系统的复杂性增加,使得代码难以理解和维护。
  • 中介者模式的实现可能会导致性能问题,特别是当对象之间的交互非常频繁时。

总体而言,中介者模式适用于一组对象之间存在复杂的交互关系,或者对象之间的耦合度过高的情况。通过引入中介者对象,可以将对象之间的通信逻辑抽离出来,提高系统的灵活性和可维护性。

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

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

相关文章

获取文件大小并转换单位

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【工具使用】Notepad++如何使用正则表达式同时搜索多个字符串

一&#xff0c;简介 在调试代码定位问题的时候&#xff0c;由于log打印比较多&#xff0c;故需要使用NotePad文本编辑器进行搜索&#xff0c;并且需要同时搜索多个字符串&#xff0c;本文介绍如何同时搜索多个字符串&#xff0c;供参考。 二&#xff0c;操作步骤 2.1 搜索设…

90、基于STM32单片机数字频率计频率检测配NE555脉冲发生器设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

如何基于 ESP-IDF SDK 为应用工程添加自定义的 menuconfig 编译条件设置?

在工程的 main 目录下添加 Kconfig.projbuild 文件对需要添加自定义设置的参数进行定义在应用代码中使用自定义设置的参数编写 Kconfig.projbuild 文件 在工程的 main 目录下添加 Kconfig.projbuild 文件 接下来会基于 esp-idf/examples/peripherals/uart/uart_async_rxtxtask…

Python黑魔法揭秘:超强公共操作符和推导式的编程技巧

文章目录 前言公共操作1.运算符1&#xff09; 合并操作2&#xff09;* 复制操作in / not in 判断数据在 / 不在容器中 公共方法len()del / del()max()min()range()enumerate() 容器类型转换1&#xff09;list() 将某个序列转化为列表tuple() 将某个序列转换为元组set() 将某个序…

OpenCloudOS社区开源,助力软件开发

早前红帽宣布限制源代码访问性的政策&#xff0c;并解释说RHEL相关源码仅通过CentOS Stream公开&#xff0c;付费客户和合作伙伴可通过Red Hat Customer Portal访问到源代码&#xff0c;由此也导致非客户获取源码越来越麻烦&#xff0c; 据了解&#xff0c;CentOS是红帽发行的…

效率为王!项目管理软件如何帮你提高效率?

对于任何商业组织及其客户来说&#xff0c;低效率的员工和浪费的时间都是一个问题。团队成员懈怠会对团队的整体效率产生负面影响。除了巨大的财务挫折之外&#xff0c;这些问题的混合还导致多次延误、工作质量差和客户不满意。 但有了正确的项目管理软件&#xff0c;企业就可…

Netty各组件执行流程及原理

目录 一、netty执行流程 二、EventLoop 1、事件循环对象EventLoop 2、事件循环对象组EventLoopGroup 3、io任务 4、分工细化 5、handler执行中如何换的group 三、Channel 1、常用方法 2、channelFuture 3、为什么要异步 四、Future & Promise 1、jdk future …

Linux13.文件(上)

1.文件 内容 属性。 2.在程序中创建一个文件&#xff0c;文件是进程创建的(跑起来才有)&#xff0c;默认路径是进程的工作路径。 3. C语言中字符串以\0结尾&#xff0c;文件不是。 4.指令 >文件 :清空文件。 5.理解cat指令的实现方式。 6.使用位操作传递宏标记位 7.操…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天&#xff0c;继续加油 今日案例来源&#xff1a;csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额&#xff0c;输出实际付款金额。购货折扣率如下&#xff1a; 购货金额≤500元…

skywalking linux安装部署

SkyWalking APM tar 下载 结合自己的es版本下载对应的tar 地址&#xff1a;https://archive.apache.org/dist/skywalking/ 由于我使用的是es7所以下载对应版本 拷贝对应链接使用wget下载 wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7…

Neon入门以及常用函数

什么是neon&#xff0c; neon是arm架构下的一个simd的一种方案&#xff0c; 本质上是一些可以用于simd的寄存器 具体参考官方的图&#xff1a; 官方的图说明对于arm开发板&#xff0c; 有16个128bit的寄存器&#xff0c;或者也可以看作是32个64bit的寄存器 列一下常用的neon…

从零开发短视频电商 使用nimbus-jose-jwt进行对称签名和非对称签名的JWT实现

文章目录 什么是JSON Web Token何时使用JSON Web TokenJSON Web Token的结构是什么头部&#xff08;Header&#xff09;负载&#xff08;Payload&#xff09;签名&#xff08;Signature&#xff09;拼接起来 如何使用JSON Web Token工具库依赖流程对称签名非对称签名 总结 JWT的…

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

Qt Quick系列(9)—初识画布

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言代码示例1源码关键知识点 代码示例2源码关键知识点 总结 前言 画布元素的基本思想是使用上下文2D对象&#xff08;ctx&#xff09;渲染路径。上下文2D对象包含必要的图形功能&…

一文读懂FPC(12)- FPC的阻抗控制

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3&#xff0c;FPC的基材 4.FPC基材压延铜和电解铜的区别 5&#xff0c;FPC的辅材 6&#xff0c;FPC常见的四种类型 7&#xff0c;FPC的生产流程简介 8&#xff0c;R-FPC的生产流程简介 9&#xff0c;FPC的发展及应用 10&a…

Vue :在 VSCode 中安装 yarn 并用 yarn 工具来控制 Vue 项目的详细过程

Ⅰ、 Yarn 工具简介&#xff1a; 1、什么是 yarn 工具: Yarn 是 facebook 发布的一款取代 npm 的资源包管理工具&#xff0c;是一个快速、可靠、安全的依赖管理工具&#xff0c;一款新的 JavaScript 资源包管理工具(吐槽下&#xff1a;最大的弊端是&#xff0c;要通过 npm 来…

java中的String使用注意事项、StringBuilder、StringBuffer、StringJoiner

String使用注意事项 这里第二次创造了0个对象是因为字符串常量池中已经有"abc" StringBuilder 注意StringBuilder支持链式编程 StringBuilder s new StringBuilder("abc"); s.append(666).append("acb" ).append(666); System.out.printl…

89、基于STM32单片机激光测距仪远距离倒车防撞报警器系统设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

操作系统8:存储器的层次结构及程序的装入和链接

目录 1、存储器的层次结构 &#xff08;1&#xff09;多层结构的存储器系统 1.1 - 存储器的多层结构 1.2 - 可执行存储器 &#xff08;2&#xff09;主存储器与寄存器 2.1 - 主存储器 2.2 - 寄存器 &#xff08;3&#xff09;高速缓存和磁盘缓存 3.1 - 高速缓存 3.2 …