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

设计模式(17):中介者模式

核心:

  • 如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量多对多关系,导致关系及其复杂,这些对象称为“同事对象”。
  • 我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网状结构化解为星状结构。

中介者模式本质:

  • 解耦多个同事对象之间的交换关系。每个对象都持有中介者对象的引用,只跟中介者打交道。我们通过中介者对象统一管理这些交互关系。

中介者模式角色

  • 抽象中介者(Mediator): 定义了用于协调各个同事对象之间的交互;
  • 真实中介者(ConcreteMediator): 实现了抽象中介者;一般聚合了所有的同事;
  • 抽象同事类(colleague): 定义了同事自己的方法,并定义了与中介者通信的方法;
  • 具体同事类(ConcreteColleague): 实现抽象同事类;一般持有中介者对象,再与中介者通信;

场景:

  • 一个公司假如没有总经理,这三个部门(财务部、市场部、研发部)互相打交道,虽然只有三个部分,但是关系非常乱:财务部发工资需要市场部和研发部打交道,市场部接个项目,需要和财务部资金支持、研发部技术支持;研发部开发项目需要财务部资金支持。
  • 实际上,公司都有总经理。各个部门有什么事情都报到总经理这里,总经理再通知各个相关部分。
  • 这就是一个典型的中介者模式,总经理起到一个中介、协调的作用。

代码实现

  • 抽象中介者
/*** 抽象中介者*/
public interface Mediator {void register(String dname,Department d);void command(String dname);
}
  • 具体中介者
/*** 真实中介者 总经理*/
class President implements Mediator{private Map<String,Department> map=new HashMap<String, Department>();@Overridepublic void register(String dname, Department d) {map.put(dname, d);}@Overridepublic void command(String dname) {map.get(dname).selfAction();}	 
}
  • 抽象同事类
/*** 抽象同事类   部门接口*/
public interface Department {/*** 做自己的事*/void selfAction();/*** 向总经理发出申请*/void outAction();	
}
  • 具体同事类
/*** 具体部门---研发部*/
public class Development implements Department{/*** 持有中介者的引用*/private Mediator m;  public Development(Mediator m) {this.m = m;m.register("Development",this);}@Overridepublic void selfAction() {System.out.println("研究开发。。。。。");}@Overridepublic void outAction() {System.out.println("需要资金支持。。。。。");	//假设调财务部m.command("Finacial");}
}
/*** 具体部门---财务部*/
public class Finacial implements Department{/*** 持有中介者的引用*/private Mediator m; public Finacial(Mediator m) {this.m = m;m.register("Finacial",this);}@Overridepublic void selfAction() {System.out.println("数钱。。。。。");}@Overridepublic void outAction() {System.out.println("钱太多了,怎么办?。。。。。");m.command("Development");m.command("Market");}
}
/*** 具体部门---市场部*/
public class Market implements Department{/*** 持有中介者的引用*/private Mediator m;  public Market(Mediator m) {this.m = m;m.register("Market",this);}@Overridepublic void selfAction() {System.out.println("接项目。。。。。");}@Overridepublic void outAction() {System.out.println("汇报工作,需要资金支持。。。。。");m.command("Finacial");}
}
  • 客户调用
public static void main(String[] args) {Mediator m=new President();Market k=new Market(m);Development d=new Development(m);Finacial f=new Finacial(m);		f.outAction();
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式(12):代理模式
          设计模式(13):模板方法模式
          设计模式(14):命令模式
          设计模式(15):迭代器模式
          设计模式(16):观察者模式
          设计模式持续更新中…

相关文章:

设计模式(17):中介者模式

核心&#xff1a; 如果一个系统中对象之间的联系呈现网状结构&#xff0c;对象之间存在大量多对多关系&#xff0c;导致关系及其复杂&#xff0c;这些对象称为“同事对象”。我们可以引入一个中介者对象&#xff0c;使各个同事对象只跟中介者对象打交道&#xff0c;将复杂的网…...

echart 折线图或散点图当横坐标为小数位时,若想显示整数该如何处理?

如图当前是这样的&#xff1a; 横坐标刻度目前是小数位&#xff0c;如果直接将小数位取整则会失去精度&#xff0c;所以我们要做的是刻度即是整数&#xff0c;又能显示小数位对应的数值&#xff1b; 思路就是直接手动设置刻度&#xff1a;设置xAxis的min,max,splitNumber,同时不…...

一套C#自主版权+应用案例的手麻系统源码

手术麻醉信息管理系统源码&#xff0c;自主版权应用案例的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c…...

31.2k star, 免费开源的白板绘图工具 tldraw

31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址&#xff1a; https://github.com/tldraw/tldraw 在线测试地址&#xff1a; tldraw 文档地址&#xff1a; tldraw SDK tldraw 是一款开源免费的无限画布白板&…...

Redis开源协议调整,我们怎么办?

2024年3月20日, Redis官方宣布&#xff0c;从 Redis 7.4版本开始&#xff0c;Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可&#xff0c;时间点恰逢刚刚完成最新一轮融资&#xff0c;宣布的时机耐人寻味。 Redis协议调整&#xff0c;对云计算…...

干了三年外包。。。忘了什么是CICD。。。

干了三年外包。。。忘了什么是CICD。。。 CI/CD(持续集成与持续交付) 是一种软件开发实践&#xff0c;它可以帮助我们更快地交付高质量的软件产品。CI/CD的核心思想是将软件开发过程中的各个阶段自动化&#xff0c;从而减少人工干预&#xff0c;提高开发效率和产品质量。本文将…...

【LeetCode】454. 四数相加 II

目录 题目 思路 代码 题目 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1…...

搜索(DFS BFS)

DFS 常规DFS: 二叉树前序,中序&#xff0c;后序遍历-CSDN博客 void postorderTraversal(root)初始化一个空列表 arrfind访问总树(root,arr)return arrvoid find(temp, arr)if temp 为空return // 调用顺序由前中后序决定find递归访问左子树find递归访问右子树arr加入当前节点…...

koc和kol是什么意思?

一、koc和kol是什么意思&#xff1f; koc和kol是专业术语。KOC是关键意见消费者的意思&#xff0c;是Key Opinion Consumer的缩写&#xff1b;KOL是关键意见领袖的意思&#xff0c;是Key Opinion Leader的缩写。 1、关键意见领袖kol “关键意见领袖”通俗地讲是达人。这些人…...

基于vscode Arduino插件开发Arduino项目

基于vscode Arduino插件开发arduino项目 插件配置问题记录1. 指定编译输出文件夹2. 编译下载时不输出详细信息3. 输出端口信息乱码4. 通过串口输出中文&#xff0c;vscode对应的串口助手上会显示乱码&#xff08;未解决&#xff09; 插件配置 环境&#xff1a;Arduino插件版本…...

AI 驱动强大是视频转换处理软件

由 AI 驱动的视频工具包。 增强、转换、录制和编辑视频AI 驱动的顶级视频工具包。 不论是老旧、低质、噪声或模糊的影片/图像&#xff0c;都能升级至 4K&#xff0c;稳定抖动的影片&#xff0c;提升帧率至 120/240fps&#xff0c;并能以全面 GPU 加速进行转换、压缩、录制和编辑…...

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…...

菜鸟笔记-Numpy函数-full/random.randint/random.choice

full函数 numpy.full 是 NumPy 库中的一个函数&#xff0c;它用于创建一个具有指定形状、数据类型和填充值的数组。此函数非常有用&#xff0c;因为它允许你快速生成一个具有相同值的数组&#xff0c;而无需手动设置每个元素。 1函数介绍 numpy.full(shape, fill_value, dty…...

蓝桥杯每日一题:牛的学术圈I(二分,双指针)

由于对计算机科学的热爱&#xff0c;以及有朝一日成为 「Bessie 博士」的诱惑&#xff0c;奶牛 Bessie 开始攻读计算机科学博士学位。 经过一段时间的学术研究&#xff0c;她已经发表了 N篇论文&#xff0c;并且她的第 i 篇论文得到了来自其他研究文献的 ci次引用。 Bessie 听…...

fping命令

fping是一个用于网络扫描的工具&#xff0c;它可以在 Linux 系统上使用。fping可以发送 ICMP ECHO_REQUEST&#xff08;即 ping&#xff09;数据包到指定的网络地址范围&#xff0c;并等待响应。通过这种方式&#xff0c;fping可以用来检测哪些 IP 地址是活跃的。 可以测试多个…...

奇富科技推出新一代全自研智能语音模型,打破沟通壁垒

“您好&#xff01;请问是李先生噻&#xff1f;” 李先生刚接起电话&#xff0c;就被这熟悉的乡音逗乐了。这不是他所预料的常规客服&#xff0c;而是奇富科技新一代全自研智能语音模型——QI语精灵。这款模型不仅能用方言与人自然交流&#xff0c;还能在智能营销、贷后提醒、风…...

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…...

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…...

Unity开发一个FPS游戏之三

在前面的两篇博客中&#xff0c;我已实现了一个FPS游戏的大部分功能&#xff0c;包括了第一人称的主角运动控制&#xff0c;武器射击以及敌人的智能行为。这里我将继续完善这个游戏&#xff0c;包括以下几个方面&#xff1a; 增加一个真实的游戏场景&#xff0c;模拟一个废弃的…...

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...