当前位置: 首页 > 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;而变量的名称通常是由用户指定…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...