(十 九)趣学设计模式 之 中介者模式!

news2025/3/9 12:15:03

在这里插入图片描述

目录

    • 一、 啥是中介者模式?
    • 二、 为什么要用中介者模式?
    • 三、 中介者模式的实现方式
    • 四、 中介者模式的优缺点
    • 五、 中介者模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解观察者模式请看: (十 八)趣学设计模式 之 观察者模式!
✨更多请看个人主页: 码熔burning

一、 啥是中介者模式?

想象一下,一个繁忙的机场 ✈️。 飞机之间不能直接通信,而是通过空中交通管制员(中介者)来协调起飞、降落等操作。 中介者模式就像是这个空中交通管制员,它负责协调多个对象之间的交互,避免对象之间直接耦合。

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

简单来说,就是找个“中间人”来协调多个对象之间的关系,避免大家直接“吵架”!

  • 多个对象之间存在复杂的交互关系: 就像多个飞机需要在机场协调起飞、降落 🛬🛫!
  • 对象之间的耦合度很高: 就像飞机之间直接通信,一旦一个飞机出现问题,可能会影响其他飞机 💥!
  • 你需要集中控制对象之间的交互: 就像需要空中交通管制员来统一协调飞机的行为 👮!

二、 为什么要用中介者模式?

用中介者模式,好处多多 👍:

  • 解耦对象之间的关系: 对象之间不需要直接引用,而是通过中介者进行通信 🤝!
  • 简化对象之间的交互: 将复杂的交互逻辑封装到中介者中,使得对象更加简单 💫!
  • 集中控制交互: 可以方便地修改和扩展对象之间的交互逻辑 ⚙️!
  • 提高代码的可维护性和可复用性: 将交互逻辑集中管理,使得代码更加清晰易懂 💡!

三、 中介者模式的实现方式

中介者模式主要包含两个核心概念:

  • 中介者(Mediator): 定义了一个接口,用于与各个同事对象通信。它知道所有的同事对象,并负责协调它们之间的交互 🏠!
  • 同事(Colleague): 定义了一个接口,用于与中介者通信。它不知道其他的同事对象,只知道自己的行为 ⚙️!
// 抽象同事类:用户

public abstract class User {
    protected ChatRoom mediator; // 中介者

    protected String name;

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

    public abstract void send(String message); // 发送消息

    public abstract void receive(String message); // 接收消息

    public String getName() {
        return name;
    }
}

// 具体同事类:普通用户

public class ConcreteUser extends User {

    public ConcreteUser(ChatRoom mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.getName() + " 发送消息: " + message);
        mediator.sendMessage(message, this); // 通过中介者发送消息
    }

    @Override
    public void receive(String message) {
        System.out.println(this.getName() + " 接收消息: " + message);
    }
}

// 抽象中介者:聊天室

public interface ChatRoom {
    void sendMessage(String message, User user); // 发送消息
}

// 具体中介者:具体聊天室

public class ConcreteChatRoom implements ChatRoom {

    private List<User> users = new ArrayList<>();

    public void register(User user) {
        users.add(user);
    }

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // 不发送给自己
            if (u != user) {
                u.receive(message);
            }
        }
    }
}

// 客户端

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

        // 创建用户
        User user1 = new ConcreteUser(chatRoom, "张三");
        User user2 = new ConcreteUser(chatRoom, "李四");
        User user3 = new ConcreteUser(chatRoom, "王五");

        // 注册用户
        chatRoom.register(user1);
        chatRoom.register(user2);
        chatRoom.register(user3);

        // 用户发送消息
        user1.send("大家好!");
        user2.send("今天天气不错!");
    }
}

代码解释

  • User 类是抽象同事类,定义了 sendreceive 方法,用于发送和接收消息。
  • ConcreteUser 类是具体同事类,实现了 User 类,负责处理用户的具体行为。
  • ChatRoom 接口是抽象中介者,定义了 sendMessage 方法,用于发送消息。
  • ConcreteChatRoom 类是具体中介者,实现了 ChatRoom 接口,负责协调用户之间的消息传递。

输出结果

张三 发送消息: 大家好!
李四 接收消息: 大家好!
王五 接收消息: 大家好!
李四 发送消息: 今天天气不错!
张三 接收消息: 今天天气不错!
王五 接收消息: 今天天气不错!

四、 中介者模式的优缺点

优点:

  • 解耦对象之间的关系 🤝!
  • 简化对象之间的交互 💫!
  • 集中控制交互 ⚙️!
  • 提高代码的可维护性和可复用性 💡!

缺点:

  • 中介者类可能会变得过于复杂,难以维护 😫!
  • 如果中介者出现问题,可能会影响整个系统的运行 🤯!

五、 中介者模式的应用场景

  • 聊天室: 用户之间通过聊天室进行通信 💬!
  • MVC 框架: 控制器作为中介者,协调模型和视图之间的交互 🖼️!
  • 机场空中交通管制: 协调飞机起飞、降落 ✈️!
  • 智能家居系统: 协调各种智能设备之间的交互 🏠!

六、 总结

  • 中介者模式就像“中间人”,协调多个对象之间的关系,避免大家直接“吵架”! 🤝
  • 核心概念包括中介者和同事! 🔑
  • 优点是解耦对象之间的关系、简化对象之间的交互、集中控制交互、提高代码的可维护性和可复用性! 👍
  • 缺点是中介者类可能会变得过于复杂,难以维护、如果中介者出现问题,可能会影响整个系统的运行! 👎
  • 适用于多个对象之间存在复杂的交互关系,并且对象之间的耦合度很高的场景! 🎯

希望这篇文章能让你彻底理解中介者模式! 💯 祝你学习愉快! 😄
看完请看:(二 十)趣学设计模式 之 迭代器模式!

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

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

相关文章

博弈论算法

一、减法游戏 初始有一个数 n。 两个玩家轮流操作&#xff0c;每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律&#xff1a; 减法游戏只需要判断当前数取模是否为0&#xff0c;即可快速判断胜负。 例题&#xff1a; Leetcode 292. Nim 游戏 …

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;工作在OSI顶层应用层&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信,B/S模式 无状态&#xff1a;每次请求独立&#xff0c;服务器不保存客户端状态&#xff08;通…

GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程

源码仓库&#xff1a; https://gitcode.com/youlai/vue3-element-admin 后端仓库&#xff1a; https://gitcode.com/youlai/youlai-boot 开源助力&#xff0c;开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板&#xff0c;它紧密贴合…

Qt常用控件之表格QTableWidget

表格QTableWidget QTableWidget 是一个表格控件&#xff0c;行和列交汇形成的每个单元格&#xff0c;是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个&#xff1a; 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…

FFmpeg入门:最简单的音视频播放器

FFmpeg入门&#xff1a;最简单的音视频播放器 前两章&#xff0c;我们已经了解了分别如何构建一个简单和音频播放器和视频播放器。 FFmpeg入门&#xff1a;最简单的音频播放器 FFmpeg入门&#xff1a;最简单的视频播放器 本章我们将结合上述两章的知识&#xff0c;看看如何融…

【Python爬虫】爬取公共交通路网数据

程序来自于Github&#xff0c;以下这篇博客作为完整的学习记录&#xff0c;也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据&#xff0c;并生成shp文件&#xff0c;…

009---基于Verilog HDL的单比特信号边沿检测

文章目录 摘要一、边沿检测二、时序逻辑实现2.1 rtl2.2 tb 三、组合逻辑实现3.1 rtl3.2 tb 摘要 文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。 一、边沿检测 边沿检测…

Trae IDE新建C#工程

目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说&#xff0c;Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了&#xff0c;下面创建多模块&#xff1a; 填好之后点击create 不删了&#xff0c;直接改包名&#xff0c;看自己喜欢 修改包名和启动类名&#xff1a; 打开ServiceApplication启动类&#xff0c;修改如下&#xff1a; …

Unity光照之Halo组件

简介 Halo 组件 是一种用于在游戏中创建光晕效果的工具&#xff0c;主要用于模拟光源周围的发光区域&#xff08;如太阳、灯泡等&#xff09;或物体表面的光线反射扩散效果。 核心功能 1.光晕生成 Halo 组件会在光源或物体的周围生成一个圆形光晕&#xff0c;模拟光线在空气…

递归专题刷题

文章目录 递归合并两个有序链表题解代码 反转链表题解代码 两两交换链表中的节点题解代码 Pow(x, n)&#xff08;快速幂&#xff09;题解代码汉诺塔题解代码 总结 递归 1. 重复的子问题宏观看待递归问题 合并两个有序链表 题目链接 题解 1. 重复的子问题 -> 函数头的设…

Android Studio 一直 Loading devices

https://stackoverflow.com/questions/71013971/android-studio-stuck-on-loading-devices

摄相机标定的基本原理

【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型&#xff1a; 定义&#xff1a; 内参&#xff1a;就像相机的“眼睛”。它描述了相机内部的特性&#xff0c;比如焦距&#xff08;镜头的放…

CentOS 7 安装 Redis6.2.6

获取资源、下载安装 Redis6.2.6 安装Redis6.2.6 上传到服务器或直接下载&#xff08;wget http://download.redis.io/releases/redis-6.2.6.tar.gz&#xff09;、再解压安装 tar -zxvf redis-6.2.6.tar.gz 进入redis解压目录 cd redis-6.2.6先编译 make再执行安装 make PREFI…

3D数字化:家居行业转型升级的关键驱动力

在科技日新月异的今天&#xff0c;家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起&#xff0c;再到如今3D数字化营销的广泛应用&#xff0c;消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷&#xff0c;还…

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…

Logisim实验--计组

每个实验会先讲一下原理再给出答案。 实验一&#xff1a;7段数码管驱动电路设计 实验目的 (1)帮助学生理解真值表方式设计电路的原理&#xff1b; (2)能利用Logisim的真值表生成电路功能自动生成所需电路。 这里我们要看清每个引脚控制的是哪个灯亮&#xff0c;注意看它的线…

【Linux】软硬链接 | 动静态链接(三)

目录 前言&#xff1a; 一、软硬链接 1.软链接 2.硬链接 3.硬链接数 4.软硬链接的区别 5.使用unlink删除链接的文件 6.目录文件链接数( . 和 .. ) 二、静态库的制作和使用 1.制作静态库 2.使用静态库 2.1方法一 2.2方法二 2.3方法三 三、动态库的制作和使用 1.…

数据结构(回顾)

数据结构&#xff08;回顾&#xff09; 回顾 不同点顺序表链表存储空间上物理上一定连续逻辑上连续&#xff0c;物理上不一定连续随机访问支持&#xff0c;时间复杂度O(1)不支持&#xff0c;时间复杂度O(N)任意位置插入或者删除元素可能需要挪动元素&#xff0c;效率低&#…

达梦数据库在Linux,信创云 安装,备份,还原

&#xff08;一&#xff09;系统环境检查 1操作系统&#xff1a;确认使用的是国产麒麟操作系统&#xff0c;检查系统版本是否兼容达梦数据库 V8。可以通过以下命令查看系统版本&#xff1a; cat /etc/os-release 2硬件资源&#xff1a;确保服务器具备足够的硬件资源&#xff0…