当前位置: 首页 > news >正文

二十三种设计模式第二十二篇--中介者模式

说到这个模式就有趣了,不知道大家在生活中喷到过中介没?其实中介这个词吧,我也说不上好还是坏,有时候他可以帮助人们更快的达到某个目的,但有的时候吧,这个有贼坑人,相信网络上有各种被中介坑的案例,但是今天我们讲的这个设计模式就是围绕中介来讲的,但是他并不是为了坑人的,在本文中的中介者模式主要是为了满足达到某个目的而进行的。

中介者模式:

它提供了一种集中式的方式来管理复杂对象之间的通信和交互。中介者模式通过引入一个中介者对象,将对象之间的通信转化为与中介者的通信,从而减少对象间的直接耦合。

中介者模式的核心组成部分包括:

中介者(Mediator):定义了对象之间通信的接口和规则,可以通过中介者来调度和协调对象之间的交互。

具体中介者(Concrete Mediator):实现了中介者接口,负责实际的对象协调和通信过程。

同事类(Colleague):定义了与其他同事类通信的接口,可以通过中介者来发送和接收消息。

具体同事类(Concrete Colleague):实现了同事类的接口,负责具体的行为和交互。

中介者模式的优点包括:

  1. 减少了对象间的直接耦合:通过引入中介者,对象之间的通信不再直接依赖于彼此,而是通过中介者来进行。
  2. **促进了对象的松耦合:**对象只需要与中介者进行通信,而不需要了解其他对象的细节,从而降低了对象之间的依赖。
  3. **简化了对象之间的交互:**中介者集中了对象间的交互逻辑,使得交互过程变得简单和可管理。

在这里插入图片描述

public class MediatorPatternDemo {public static void main(String[] args) {//同事对象User robert = new User("Robert");User john = new User("John");//robert向john打招呼的信息通过 聊天室  ChatRoom 发出.robert.sendMessage("Hi! John!");john.sendMessage("Hello! Robert!");}
}
/*** 具体中介者(Concrete Mediator)角色*/
public class ChatRoom {//发送信息public static void showMessage(User user, String message){System.out.println(new Date().toString()+ " [" + user.getName() +"] : " + message);}
}
/*** 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。** 当User之间要互相传递消息时,由   ChatRoom这个中介者来完成.*/
public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name){this.name  = name;}//****发信息public void sendMessage(String message){//调用中介者来发送.ChatRoom.showMessage(this,    message);}
}

其缺点在于:
中介者的责任可能会变得复杂:随着对象之间的交互规则增加,中介者可能变得复杂且难以维护。
可能导致系统中心化:过度使用中介者模式可能导致系统中心化,使得中介者成为系统的瓶颈。

中介者模式,不应该在职责混乱的时候使用,否则这样会导致系统更加混乱。

相关文章:

二十三种设计模式第二十二篇--中介者模式

说到这个模式就有趣了,不知道大家在生活中喷到过中介没?其实中介这个词吧,我也说不上好还是坏,有时候他可以帮助人们更快的达到某个目的,但有的时候吧,这个有贼坑人,相信网络上有各种被中介坑的…...

小研究 - 微服务系统服务依赖发现技术综述(二)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…...

javaee 泛型的上下边界和通配符的使用

下边界 package com.test.generic;import java.util.Collection;public class TestGenericClass {//泛型方法 ? extends E :泛型的限定public static <E> void move(Collection<E> from,Collection<? super E> to){for(E e:from){to.add(e);}}public st…...

【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用&#xff08;二&#xff09; 一、前言 TypeScript开发中需要对定义的变量指定类型&#xff0c;目前版本都支持哪些类型&#xff0c;每一个类型都有哪些含义&#xff0c;在这篇文章中&#xff0c;我们将会对其进行总结说明 二、JavaScript基本数据…...

rust from_utf8_lossy怎么使用?

from_utf8_lossy 是Rust标准库中的一个方法&#xff0c;用于将字节序列解码为UTF-8字符串。它的作用是尽可能地将无效的字节序列转换为有效的Unicode字符&#xff0c;以便进行后续处理。 以下是使用 from_utf8_lossy 方法的示例代码&#xff1a; fn main() {let bytes b"…...

#P0997. [NOIP2006普及组] 数列

题目描述 给定一个正整数k(3≤k≤15)k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列&#xff0c;例如&#xff0c;当k3k3时&#xff0c;这个序列是&#xff1a; 1,3,4,9,10,12,13,…1,3,4,9,10,12,13,… &#xff08;该序列实际上就是&…...

做完两年外包,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…...

Kubernetes系列-Ingress

1 Ingress 概述 Kubernetes 对外暴露服务&#xff08;Service&#xff09;主要有两种方式&#xff1a;NodePort&#xff0c;LoadBalance&#xff0c;此外 externalIps 也可以使各类 service 对外提供服务&#xff0c;但是当集群服务很多的时候&#xff0c;NodePort方式最大的缺…...

软件测试之Docker常见问题汇总!附解决方法!

1、配置国内源进行docker安装&#xff0c;报错 HTTP Error 404 - Not Found 【整整200集】超超超详细的Python接口自动化测试进阶教程&#xff0c;真实模拟企业项目实战&#xff01;&#xff01; 原因&#xff1a; 由于配置国内镜像源时&#xff0c;把地址写错了&#xff0c;导…...

Python-操作Excel表-openpyxl模块使用

openpyxl简介 openpyxl是一个强大的Python库,用于读写Excel(xlsx/xlsm/xltx/xltm)文件。 主要功能和特点如下: 读取、修改、写入Excel文件,支持格式如xlsx、xlsm等支持 Excel 2003 以上格式可以很方便地遍历工作表中的行和列获取单元格对象后,可以修改单元格的值、样式、格式…...

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了&#xff0c;同时提交的工单也通过了 2、这里主要是goupId 需要进行认证&#xff0c;需要到域名注册商近一个txt的解析&#xff0c;以便确保这个是你的 通过下面来验证你的域名信息&#xff0c;这里主要是上面的工…...

【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录

本文主要介绍如下内容: 关于几个Block类之间的继承、实现关系;针对文章标题中的每个类,细化到每个成员去注释分析列出、并详细分析BlockInfo抽象类提供的抽象方法、非抽象方法的功能针对几个跟块组织结构的方法再进行分析。moveBlockToHead、listInsert、listRemove等。一、…...

STM32 LoRa(学习二)

LoRa关键参数说明 LoRa数据包由三个部分组成&#xff1a;前导码、可选报头、数据有效负载。 前导码&#xff1a;用于保持接收机与输入的数据流同步。默认情况下&#xff0c;数据包含有12个符号长度的前导码。前导码是一个可以通过编程来设置的变量&#xff0c;所以前导码的长度…...

ASP.NET Core学习路线图

说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…...

无涯教程-Lua - for语句函数

for 循环是一种重复控制结构&#xff0c;可让您有效地编写需要执行特定次数的循环。 for loop - 语法 Lua编程语言中 for 循环的语法如下- for init,max/min value, increment dostatement(s) end 这是 for 循环中的控制流程- 首先执行 init 步骤&#xff0c;并且仅执行一…...

二叉树的相关题目

目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历&#xff08;非递归实现&#xff09; 8、二叉树的中序遍历&#xff08…...

【antd之tabs踩坑篇】Tabs有items时切换不起作用

<TabsdefaultActiveKey"1"tabPosition{mode}style{{ height: 220 }}items{new Array(30).fill(null).map((_, i) > {const id String(i);return {label: Tab-${id},key: id,disabled: i 28,children: Content of tab ${id},};})}/>官网上如果tabs有很多it…...

简单模拟livedata数据倒灌

简单模拟livedata数据倒灌 数据倒灌&#xff0c;就是将旧的或只展示一次的数据再次展现出来。 livedata内部通过版本号更新可见视图数据&#xff0c;而在view在活跃与不活跃之间反复横跳时&#xff0c;livedata也会通知数据。 class MainActivity : AppCompatActivity() {pri…...

python爬虫-加速乐cookie混淆解析实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;抓包工具第一次请求页面&#xff0c;得到响应。本次我使用的fiddle进行抓包&#…...

TensorFlow 中前缀 prefix

前缀 prefix 主要用于命名 TensorFlow 中的变量&#xff0c;以避免变量名冲突。在 TensorFlow 中&#xff0c;每个变量都有一个唯一的名称&#xff0c;由变量的作用域和变量的名称组成。作用域可以通过 tf.variable_scope() 函数来创建&#xff0c;而变量的名称通常是由用户指定…...

JADX完整指南:Android APK反编译与Java源码逆向工程实战

JADX完整指南&#xff1a;Android APK反编译与Java源码逆向工程实战 【免费下载链接】jadx Dex to Java decompiler 项目地址: https://gitcode.com/gh_mirrors/ja/jadx JADX是一款强大的Android逆向工程工具&#xff0c;能够将DEX字节码高效转换为可读的Java源代码。作…...

手把手教你用Python给本地文档集建个‘迷你搜索引擎’(基于倒排索引与布尔查询)

手把手教你用Python给本地文档集建个‘迷你搜索引擎’&#xff08;基于倒排索引与布尔查询&#xff09; 在信息爆炸的时代&#xff0c;如何快速从海量文档中找到所需内容&#xff1f;本文将带你用Python从零构建一个针对本地TXT/Markdown文档的迷你搜索引擎。无需依赖Elasticse…...

终极指南:用Universal x86 Tuning Utility彻底解决笔记本高温降频问题

终极指南&#xff1a;用Universal x86 Tuning Utility彻底解决笔记本高温降频问题 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility …...

别再只用MD5了!手把手教你用Java Bouncy Castle库实现SM3加盐密码存储

从MD5到SM3&#xff1a;Java开发者必备的密码存储安全升级指南 在当今数据泄露频发的时代&#xff0c;密码存储的安全性已成为每个Java开发者必须重视的基础课题。许多遗留系统仍在使用MD5这样的弱哈希算法&#xff0c;这无异于在数字世界中用纸板门保护金库。本文将带你深入了…...

Cold Diffusion:超越高斯噪声的通用图像生成框架解析

1. Cold Diffusion的核心思想&#xff1a;从噪声依赖到通用框架 第一次看到Cold Diffusion论文时&#xff0c;我正被传统扩散模型对高斯噪声的强依赖性困扰着。当时在做一个艺术风格转换项目&#xff0c;发现用标准DDPM处理非自然图像时效果总是不稳定。Cold Diffusion的出现就…...

B站视频下载终极指南:3分钟掌握BilibiliDown高效批量下载技巧

B站视频下载终极指南&#xff1a;3分钟掌握BilibiliDown高效批量下载技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mi…...

告别KITTI格式焦虑:手把手教你用MMDetection3D处理自定义点云数据集(含PLY/OBJ转换)

告别KITTI格式焦虑&#xff1a;手把手教你用MMDetection3D处理自定义点云数据集&#xff08;含PLY/OBJ转换&#xff09; 当研究者首次尝试将自采集的3D点云数据投入MMDetection3D框架时&#xff0c;往往会陷入数据格式适配的困境。不同于标准KITTI数据集提供的.bin文件&#xf…...

暗黑破坏神2存档编辑器:5分钟掌握D2/D2R角色修改技巧

暗黑破坏神2存档编辑器&#xff1a;5分钟掌握D2/D2R角色修改技巧 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款功能强大的暗黑破坏神2存档修改工具&#xff0c;专为D2和D2R玩家设计。这款基于Web的开源编辑器…...

Tiled地图编辑器终极指南:从零开始构建专业级2D游戏场景

Tiled地图编辑器终极指南&#xff1a;从零开始构建专业级2D游戏场景 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled Tiled是一款专为游戏开发者设计的开源2D地图编辑器&#xff0c;以其灵活的图块系统、无限地图编辑…...

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

STM32 SAI接口实战&#xff1a;用CubeMX快速配置多通道音频采集&#xff08;附DMA优化技巧&#xff09; 在嵌入式音频处理领域&#xff0c;STM32的SAI&#xff08;Serial Audio Interface&#xff09;接口因其灵活性和高性能成为多通道音频采集的理想选择。本文将带您从零开始&…...