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

Java中介者模式剖析及使用场景

中介者模式

  • 一、介绍
  • 二、智能家居系统项目实现
  • 三、总结
    • 1.优点
    • 2.缺点
    • 3.使用经验
    • 4.Spring框架类似使用思想

一、介绍

  1. 介者模式是一种行为型设计模式,它允许对象之间通过一个中介者对象进行通信,而不是直接相互引用。将多对多的关系转化为一对多的关系,对象之间不再直接相互通信,而是通过中介者进行通信,降低了对象之间的耦合度。

  2. 就好像在一个团队中,每个人都不直接与其他成员交流,而是通过一个团队领导来协调沟通。这样做可以有效减少成员之间的关联,提高系统的灵活性和可维护性

  3. 下面4个关键,同事对象的状态发生变化时,它会通知中介者,中介者可以根据需要向其他同事对象发送消息或者执行特定的操作

  • 中介者接口:定义了中介者对象的接口,用于和各个同事类进行通信。
  • 具体中介者:实现了中介者接口,负责协调、控制各个同事类的行为。
  • 同事类:具体的对象类,需要和其他对象进行交互,但是通过中介者来实现
  • 具体同事对象:实现同事接口,与其他同事对象进行通信时将请求转发给中介者

二、智能家居系统项目实现

  • 需求:智能家居中各个设备之间的联动控制,如灯光、温度、安防等

    1. Mediator中介者接口定义控制设备的方法controlDevice

    2. SmartHomeMediator实现中介者接口,组合设备(同事类)有light灯光thermostat设备温度security安防类,实现controlDevice控制方法写逻辑、发送给各个设备对象的方法receiveMessage

    3. Light 、Thermostat 、Security 同事类 - 具体设备类,主要定义接收来自中介者的消息方法receiveMessage来控制开、关等设备方法

    4. main方法创建每个设备对象、以及中介者对象,中介者对象创建完,初始化引用每个设备对象。中介者对象自己方法controlDevice发送消息给指定设备。

// 1.定义中介者接口
public interface Mediator {// 控制设备的方法void controlDevice(String device, String message);
}// 2. 具体中介者类
public class SmartHomeMediator implements Mediator {// 同事类 - 具体设备类//灯光private Light light;//设备温度private Thermostat thermostat;//安防private Security security;public SmartHomeMediator(Light light, Thermostat thermostat, Security security) {this.light = light;this.thermostat = thermostat;this.security = security;}@Overridepublic void controlDevice(String device, String message) {// 根据设备名称分发消息给对应的设备if (device.equalsIgnoreCase("light")) {light.receiveMessage(message);} else if (device.equalsIgnoreCase("thermostat")) {thermostat.receiveMessage(message);} else if (device.equalsIgnoreCase("security")) {security.receiveMessage(message);} else {System.out.println("Device not found");}}
}// 3. 同事类 - 具体设备类
public class Light {// 打开灯光public void turnOn() {System.out.println("Light is on");}// 关闭灯光public void turnOff() {System.out.println("Light is off");}// 接收来自中介者的消息public void receiveMessage(String message) {// 根据消息内容执行相应动作if (message.equalsIgnoreCase("turn on")) {turnOn();} else if (message.equalsIgnoreCase("turn off")) {turnOff();}}
}// 4. 同事类 - 具体设备类
public class Thermostat {// 设置温度public void setTemperature(int temperature) {System.out.println("Thermostat set to " + temperature + " degrees");}// 接收来自中介者的消息public void receiveMessage(String message) {// 解析消息并执行相应动作if (message.startsWith("set temperature")) {int temperature = Integer.parseInt(message.split(" ")[2]);setTemperature(temperature);}}
}// 5. 同事类 - 具体设备类
public class Security {// 启动安防系统public void arm() {System.out.println("Security system armed");}// 关闭安防系统public void disarm() {System.out.println("Security system disarmed");}// 接收来自中介者的消息public void receiveMessage(String message) {// 根据消息内容执行相应动作if (message.equalsIgnoreCase("arm")) {arm();} else if (message.equalsIgnoreCase("disarm")) {disarm();}}
}public class Main {public static void main(String[] args) {// 创建中介者和各个设备Light light = new Light();Thermostat thermostat = new Thermostat();Security security = new Security();// 初始化智能家居中介者Mediator smartHome = new SmartHomeMediator(light, thermostat, security);// 控制各个设备smartHome.controlDevice("light", "turn on");smartHome.controlDevice("thermostat", "set temperature 22");smartHome.controlDevice("security", "arm");}
}

三、总结

1.优点

  1. 减少类之间的直接耦合,通过中介者模式,各个同事类不再直接依赖彼此,而是通过中介者来进行通信,从而降低了类之间的耦合度。
  2. 简化对象之间的交互,中介者模式提供了一个集中管理和协调对象之间交互的方式,使得对象之间的交互逻辑更加清晰和易于理解。
  3. 提高系统的灵活性,通过中介者模式,可以更容易地增加新的同事类或修改其行为,而不会影响到其他类。

2.缺点

  1. 中介者本身可能变得过于庞大,随着业务逻辑的增长,中介者可能会变得复杂,处理过多不同类的交互,导致中介者本身的维护困难。
  2. 增加了系统的复杂性,中介者模式引入了新的抽象层,会导致系统整体结构变得更加复杂。

3.使用经验

  1. 当需要管理多个对象之间的复杂交互时,考虑使用中介者模式,这可以帮助简化对象之间的通信。

  2. 避免滥用中介者模式,只有当对象之间的交互关系比较复杂且需要集中管理时才使用中介者模式,避免为了简单的交互关系而引入中介者。

  3. 注意中介者的职责,确保中介者的职责是清晰明确的,不要让中介者承担过多的责任,以免破坏单一职责原则。

4.Spring框架类似使用思想

  • 常用类似中介者模式的设计来实现消息传递、事件处理、组件协作等功能
  • Spring 提供了 ApplicationEvent 和 ApplicationListener 接口来实现事件的发布与订阅
  • 这种机制就类似于中介者模式, ApplicationEvent 作为消息,ApplicationListener 充当中介者的角色,负责接收和处理事件消息。

相关文章:

Java中介者模式剖析及使用场景

中介者模式 一、介绍二、智能家居系统项目实现三、总结1.优点2.缺点3.使用经验4.Spring框架类似使用思想 一、介绍 介者模式是一种行为型设计模式,它允许对象之间通过一个中介者对象进行通信,而不是直接相互引用。将多对多的关系转化为一对多的关系&…...

ElevenLabs用AI为Sora文生视频模型配音 ,景联文科技提供高质量真人音频数据集助力生成逼真音效

随着Open AI公司推出的Sora文生视频模型惊艳亮相互联网,AI语音克隆创企ElevenLabs又为Sora的演示视频生成了配音,所有的音效均由AI创造,与视频内容完美融合。 ElevenLabs的语音克隆技术能够从一分钟的音频样本中创建逼真的声音。为了实现这一…...

Go语言基础

Go的数据类型定义 //运行第一个程序package main func main(){print("Hello World") }在GO语言中,一个程序只能有一个main包,对应只能有一个main方法,若无法满足这个条件,编译时将会报错。注释方式与PHP相同 import的使…...

IOS覆盖率报告info文件解读

一,IOS覆盖率报告的生成 在做前端精准测试的时候,对于iOS端,通常会做如下操作: (1)合并覆盖率数据 如下操作: xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_fil…...

爬虫实战——scrapy框架爬取多张图片

scrapy框架的基本使用,请参考我的另一篇文章:scrapy框架的基本使用 起始爬取的网页如下: 点击每张图片,可以进入图片的详情页,如下: 代码实现: 项目文件结构如下 img_download.py文件代码 im…...

LLVM TableGen 系统学习笔记

Basic TableGen 系统可以帮助记录领域特定的信息。它也可以认为是一种小型的编译系统。 TableGen 责负分析文件, 分析结果交给领域特定的后端进行处理。 重要的概念 records 一个 record 有一个独立的名称,一系列值和一系列父类。 它保存了特定领域…...

基于stm32的流水灯设计

1基于stm32的流水灯设计[proteus仿真] 速度检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的自行车测速系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥&#xff0c…...

kotlin图片合成和压缩

kotlin图片合成和压缩 之前的方法是继承AsyncTask 在doInBackground 里面去做压缩的操作&#xff0c;然后用 publishProgress 切到主线程里面更新 新方法是在协程里的去做 class ImageService {private fun getSumWidths(bitmaps: ArrayList<Bitmap>): Int {var sumWid…...

Java学习笔记004——接口概念理解及意义

一个类中有抽象方法&#xff0c;则必须声明为abstract&#xff08;做为抽象类&#xff09;&#xff0c;抽象类不能实例化。子类继承抽象类&#xff0c;必须对所有的抽象方法重写&#xff0c;否则依然有抽象方法&#xff0c;还是抽象的&#xff0c;无法实例化。故抽象类常做为基…...

MT笔试题

前言 某团硬件工程师的笔试题&#xff0c;个人感觉题目的价值还是很高的&#xff0c;分为选择题和编程题&#xff0c;选择题考的是嵌入式基础知识&#xff0c;编程题是两道算法题&#xff0c;一道为简单难度&#xff0c;一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…...

50道SQL面试题

50道SQL面试题 有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 环境 -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS teacher; CREATE TABLE teacher (t_id varchar(20) …...

2024蓝桥杯每日一题(双指针)

一、第一题&#xff1a;牛的学术圈 解题思路&#xff1a;双指针贪心 仔细思考可以知道&#xff0c;写一篇综述最多在原来的H指数的基础上1&#xff0c;所以基本方法可以是先求出原始的H指数&#xff0c;然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…...

Android 开发过程中常见的内存泄漏场景分析

场景1 Static变量存储上下文环境Context public class ClassName {// 定义1个静态变量private static Context mContext;//... // 引用的是Activity的contextmContext context; // 当Activity需销毁时&#xff0c;由于mContext 静态 & 生命周期 应用程序的生命周期&…...

Codeforces-1935E:Distance Learning Courses in MAC(思维)

E. Distance Learning Courses in MAC time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The New Year has arrived in the Master’s Assistance Center, which means it’s time to introduce a new feature…...

ZooKeeper和Diamond有什么不同

本文主要是讨论下两个类似产品&#xff1a;ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond&#xff0c;顾名思义&#xff0c;寄寓了开发人员对产品稳定性的厚望&#xff0c;希望它像钻石一样&#xff0c;提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…...

三、N元语法(N-gram)

为了弥补 One-Hot 独热编码的维度灾难和语义鸿沟以及 BOW 词袋模型丢失词序信息和稀疏性这些缺陷&#xff0c;将词表示成一个低维的实数向量&#xff0c;且相似的词的向量表示是相近的&#xff0c;可以用向量之间的距离来衡量相似度。 N-gram 统计语言模型是用来计算句子概率的…...

QML 3D入门知识路线

目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布&#xff0c;所以有很多module会发生变化&#xff0c;主要有核心module、输入、逻辑、渲染、动画和扩展module&#xff0c;以及2D/3D场景模块 类名 能…...

蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)

蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…...

c++ 类内可以定义引用数据成员吗?

在C中&#xff0c;类内是可以定义引用数据成员的&#xff0c;但是在初始化对象时&#xff0c;必须在构造函数的成员初始化列表中对引用进行初始化&#xff0c;因为引用必须在创建时被初始化&#xff0c;并且不能在其生存期内引用不同的对象。下面是一个简单的示例&#xff1a; …...

MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X

CleanMyMac X是一款专业的Mac清理软件&#xff0c;具备多种强大功能。首先&#xff0c;它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包&#xff0c;从而快速释放电脑内存。其次&#xff0c;CleanMyMac X可以轻松管理和升级Mac上的应用&#xff0c;同时强力卸载恶意软件并修…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...

使用ch340继电器完成随机断电测试

前言 如图所示是市面上常见的OTA压测继电器&#xff0c;通过ch340串口模块完成对继电器的分路控制&#xff0c;这里我编写了一个脚本方便对4路继电器的控制&#xff0c;可以设置开启时间&#xff0c;关闭时间&#xff0c;复位等功能 软件界面 在设备管理器查看串口号后&…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)

文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button&#xff08;鼠标点击不放连续移动快捷键&#xff09; Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...