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

目录
- 一、 啥是中介者模式?
- 二、 为什么要用中介者模式?
- 三、 中介者模式的实现方式
- 四、 中介者模式的优缺点
- 五、 中介者模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解观察者模式请看: (十 八)趣学设计模式 之 观察者模式!
✨更多请看个人主页: 码熔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);}@Overridepublic void send(String message) {System.out.println(this.getName() + " 发送消息: " + message);mediator.sendMessage(message, this); // 通过中介者发送消息}@Overridepublic 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);}@Overridepublic 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类是抽象同事类,定义了send和receive方法,用于发送和接收消息。ConcreteUser类是具体同事类,实现了User类,负责处理用户的具体行为。ChatRoom接口是抽象中介者,定义了sendMessage方法,用于发送消息。ConcreteChatRoom类是具体中介者,实现了ChatRoom接口,负责协调用户之间的消息传递。
输出结果
张三 发送消息: 大家好!
李四 接收消息: 大家好!
王五 接收消息: 大家好!
李四 发送消息: 今天天气不错!
张三 接收消息: 今天天气不错!
王五 接收消息: 今天天气不错!
四、 中介者模式的优缺点
优点:
- 解耦对象之间的关系 🤝!
- 简化对象之间的交互 💫!
- 集中控制交互 ⚙️!
- 提高代码的可维护性和可复用性 💡!
缺点:
- 中介者类可能会变得过于复杂,难以维护 😫!
- 如果中介者出现问题,可能会影响整个系统的运行 🤯!
五、 中介者模式的应用场景
- 聊天室: 用户之间通过聊天室进行通信 💬!
- MVC 框架: 控制器作为中介者,协调模型和视图之间的交互 🖼️!
- 机场空中交通管制: 协调飞机起飞、降落 ✈️!
- 智能家居系统: 协调各种智能设备之间的交互 🏠!
六、 总结
- 中介者模式就像“中间人”,协调多个对象之间的关系,避免大家直接“吵架”! 🤝
- 核心概念包括中介者和同事! 🔑
- 优点是解耦对象之间的关系、简化对象之间的交互、集中控制交互、提高代码的可维护性和可复用性! 👍
- 缺点是中介者类可能会变得过于复杂,难以维护、如果中介者出现问题,可能会影响整个系统的运行! 👎
- 适用于多个对象之间存在复杂的交互关系,并且对象之间的耦合度很高的场景! 🎯
希望这篇文章能让你彻底理解中介者模式! 💯 祝你学习愉快! 😄
看完请看:(二 十)趣学设计模式 之 迭代器模式!
相关文章:
(十 九)趣学设计模式 之 中介者模式!
目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
Leetcode 54: 螺旋矩阵
Leetcode 54: 螺旋矩阵 是一道经典的矩阵遍历模拟题目,要求我们以螺旋顺序遍历一个二维数组。这个问题在面试中非常经典,考察模拟、数组操作以及逻辑清晰度。掌握本题的高效解法可以迅速给面试官留下好印象。 适合面试的解法:边界法ÿ…...
abseil-cpp:环境搭建
参考: https://abseil.io/docs/cpp/quickstart-cmake abseil-cpp.git/dd4c89b abseil-cpp.git/20240722.1 1. clone代码仓库、编译 git clone https://github.com/abseil/abseil-cpp.git /app/abseil-cpp/ #/app/abseil-cpp/.git/config git checkout 20240722.1git rev-pa…...
Centos7部署k8s(单master节点安装)
单master节点部署k8s集群(Centos) 一、安装前准备 1、修改主机名 按照资源准备修改即可 # master01 hostnamectl set-hostname master01 ; bash # node1 hostnamectl set-hostname node1 ; bash # node2 hostnamectl set-hostname node2 ; bash2、修改hosts文件 以下命令所…...
RPA 职业前景:个人职场发展的 “新机遇”
1. RPA职业定义与范畴 1.1 RPA核心概念 机器人流程自动化(RPA)是一种通过软件机器人模拟人类操作,自动执行重复性、规则性任务的技术。RPA的核心在于其能够高效、准确地处理大量数据和流程,减少人工干预,从而提高工作…...
详解DeepSeek模型底层原理及和ChatGPT区别点
一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...
《2025年软件测试工程师面试》JAVA基础面试题
基础题 == 和 equals 的区别是什么? ==比较的是引用是否相同,比较的是对象的引用地址,如果比较的两个对象地址位不同,值相同也会返回falseequals()比较的是...
【算法学习之路】5.贪心算法
贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳!3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新…...
如何打造一个安全稳定的海外社媒账号?
您好!随着TikTok、Instagram、Facebook等海外社媒平台的迅猛发展,越来越多的个人和企业希望借助这些平台实现全球化传播。然而,注册和运营海外社媒账号的过程中,许多人频繁遭遇到封禁、限制和账号关联等问题,常常导致严…...
【Python 数据结构 5.栈】
目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …...
Qt开发⑪Qt网络+Qt音视频_使用实操
目录 1. Qt 网络 1.1 UDP Socket 1.2 TCP Socket 1.3 HTTP Client 2. Qt 音视频 2.1 Qt 音频 2.2 Qt 视频 本篇完。 1. Qt 网络 和多线程类似,Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 实际 Qt 开发中进行网络编程,也不一定使用…...
JavaEE--计算机是如何工作的
一、一台计算机的组成部分 1.CPU(中央处理器) 2.主板(一个大插座) 3.内存(存储数据的主要模板) 4.硬盘(存储数据的主要模板) 内存和硬盘对比: 内存硬盘读写速度快慢存…...
API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南
API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南 本文详细介绍一种基于 Web 搜索方式实现的企业信息查询接口,适用于数据补全、企业资质验证、信息查询等场景。文章内容涵盖接口功能、请求参数、返…...
微信小程序text组件decode属性的小问题
今天学习微信小程序的text组件,这个组件类似于网页制作中的span标签,内联文本只能用 text 组件,不能用 view,如 foo bar </text。 text组件常用属性如下表: 属性说明user-select文本是否可选,该属性会使…...
【计算机网络入门】初学计算机网络(九)
目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…...
LeetCode 974:和可被 K 整除的子数组
974. 和可被 K 整除的子数组 - 力扣(LeetCode) 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。 子数组 是数组中 连续 的部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k …...
vector习题
完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和,如:6321。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述ÿ…...
001-码云操作
码云操作 一、配置公钥1.官网地址1.进入 git bash2.查看生成的公钥3.设置到 Gitee4.测试 二、初始化一个项目1.新建仓库 一、配置公钥 方便后续提交代码不用填写密码 1.官网地址 官网地址:https://gitee.com/Git码云教程:https://gitee.com/help/arti…...
数据结构:二叉搜索树(排序树)
1.二叉搜索树的定义 二叉搜索树要么是空树,要么是满足以下特性的树 (1)左子树不为空,那么左子树左右节点的值都小于根节点的值 (2)右子树不为空,那么右子树左右节点的值都大于根节点的值 &#…...
【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
原子制造:从单原子操控到新材料创制的技术原理与应用
1. 原子制造:从宏观“锤子”到微观“镊子”的范式革命我们常说,人类文明史是一部材料史。从打磨石器的旧石器时代,到熔铸青铜的青铜时代,再到锻造钢铁的工业时代,每一次文明的跃迁,都伴随着我们对物质操控能…...
从游戏动作到影视特效:Blender Python骨骼动画脚本的跨界实战指南
从游戏动作到影视特效:Blender Python骨骼动画脚本的跨界实战指南 在数字内容创作领域,骨骼动画是连接游戏开发与影视特效的核心技术纽带。无论是独立游戏开发者需要将角色动作导出到Unity引擎,还是影视动画师希望批量处理动作捕捉数据&#…...
Go语言实现CI/CD流水线:从GitHub Actions到Argo CD的完整指南
Go语言实现CI/CD流水线:从GitHub Actions到Argo CD的完整指南 引言 CI/CD是现代软件开发的核心实践,Go语言项目可以通过各种CI/CD工具实现自动化构建、测试和部署。本文将深入探讨Go语言项目的CI/CD流水线实现,涵盖GitHub Actions、GitLab CI…...
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南 在当今快速迭代的互联网开发领域,后端服务的轻量化与敏捷部署已成为开发者关注的焦点。uniCloud作为一款面向全栈开发的云服务平台,其云函数功能让前端开发者也能轻松处理…...
从“黑盒”到“白盒”:深入理解PHP伪协议php://input的底层机制与安全开发启示
从“黑盒”到“白盒”:深入理解PHP伪协议php://input的底层机制与安全开发启示 在Web安全领域,文件包含漏洞一直是攻击者青睐的攻击向量。而PHP伪协议php://input的巧妙利用,往往能让看似无害的文件包含操作演变为致命的远程代码执行漏洞。本…...
良心云服务器部署的AI应用如何借助Taotoken实现多模型降级策略
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 良心云服务器部署的AI应用如何借助Taotoken实现多模型降级策略 在生产环境中,部署于云服务器上的AI应用对服务的连续性…...
Perplexity诗词搜索私有化部署全指南:在本地GPU上运行完整古诗理解Pipeline(含《全唐诗》向量化+平仄校验模块,资源包限今日领取)
更多请点击: https://intelliparadigm.com 第一章:Perplexity诗词歌赋搜索 Perplexity 作为一款以推理深度见长的 AI 搜索引擎,其在中文古典文学领域的检索能力尤为突出。不同于传统关键词匹配,它通过语义理解与上下文建模&#…...
3分钟掌握Shutter Encoder:免费开源的终极视频转换工具解决方案
3分钟掌握Shutter Encoder:免费开源的终极视频转换工具解决方案 【免费下载链接】shutter-encoder A professional video compression tool accessible to all, mostly based on FFmpeg. 项目地址: https://gitcode.com/gh_mirrors/sh/shutter-encoder 还在为…...
OpenWrt补丁踩坑实录:从‘尾随空格’警告到make update失败的完整排错指南
OpenWrt补丁踩坑实录:从‘尾随空格’警告到make update失败的完整排错指南 当你第一次尝试为OpenWrt制作补丁时,可能会觉得这就像在玩一个充满陷阱的迷宫游戏。每次你以为按照教程走就能顺利通关,却总会在某个转角遇到意想不到的错误提示。本…...
联发科MT6873核心板:5G安卓设备开发实战与硬件设计指南
1. 项目概述:MT6873核心板,一款为智能终端注入5G灵魂的“心脏”在智能硬件开发领域,选对一颗“心脏”——也就是核心板或主控模块,往往决定了整个产品的性能上限、功能边界和市场竞争力。今天要深入聊的,就是联发科&am…...
