当前位置: 首页 > 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;同时强力卸载恶意软件并修…...

冲刺待办列表管理化技术任务分解与估算

冲刺待办列表管理化技术任务分解与估算&#xff1a;高效协作的核心 在快节奏的软件开发中&#xff0c;冲刺待办列表&#xff08;Sprint Backlog&#xff09;是敏捷团队实现目标的关键工具。通过将复杂任务拆解为可执行单元并合理估算工作量&#xff0c;团队能提升交付效率与质…...

Pixel Aurora Engine显存优化:12GB显存稳定生成1024x1024像素画技巧

Pixel Aurora Engine显存优化&#xff1a;12GB显存稳定生成1024x1024像素画技巧 1. 为什么需要显存优化 1.1 高分辨率像素画的显存挑战 生成1024x1024分辨率的像素艺术画作时&#xff0c;显存占用会急剧增加。传统的扩散模型在生成高分辨率图像时&#xff0c;显存消耗往往超…...

2015年的一个RFC草案,如何终结了“证书到期导致网站崩溃“的深夜急救时代

我们在HTTPS还没全面普及的前十年&#xff0c;互联网运维圈里流传着一句特别扎心的黑色玩笑&#xff1a;“再稳定的网站&#xff0c;也逃不过证书过期的午夜惊魂”。相信不少运维人都有过这样的经历——凌晨睡得正沉&#xff0c;突然被监控告警吵醒&#xff0c;迷迷糊糊地爬起来…...

C++代码静态检查脚本工具(指针判空越界访问除0风险)

做了个小项目需要进行代码规范检查&#xff0c;但试了两个CPP静态检查工具&#xff0c;效果都不太好。为了快速迭代维护&#xff0c;直接用pyAI写了个常规代码规范校验脚本工具。目前实现三个功能并封了界面&#xff1a;空指针访问、数组越界访问、除0风险排查。用sample文件夹…...

C语言入门电子书免费领,小学生也能看懂

嘿&#xff0c;各位&#xff0c;我乃是良许&#xff0c;是一位在那嵌入式这个范畴里头&#xff0c;深深钻研了足足 12 年之久的资深工程师&#xff0c;还是先前于世界 500 强企业任职过的高级工程师。我耗用了3个月时长&#xff0c;撰写出一部C语言电子书&#xff0c;运用极为通…...

从无人机航拍到手机AR:聊聊相机标定为啥是三维重建的‘地基’

从无人机航拍到手机AR&#xff1a;相机标定如何成为三维重建的隐形支柱 当你用手机AR应用测量家具尺寸时&#xff0c;可曾想过为什么虚拟尺子能精准贴合现实物体&#xff1f;当无人机自动生成建筑三维模型时&#xff0c;又是什么保证了砖墙缝隙的毫米级还原&#xff1f;这些技术…...

从理论到实践:傅里叶变换、DFT与FFT的数学原理与代码实现

1. 傅里叶变换&#xff1a;从物理现象到数学表达 第一次接触傅里叶变换时&#xff0c;我盯着那堆积分符号看了整整一个下午。直到某天深夜调试音频处理程序时突然顿悟&#xff1a;原来它就像音乐的"成分分析仪"。想象你面前有杯混合果汁&#xff0c;傅里叶变换能告诉…...

AgentRun:当 Serverless 与 AI Agent 结合,如何颠覆传统的舆情分析模式

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

刚进课题组被要求读文献做调研,零基础小白应该怎么做?

刚加入课题组的研究生新生&#xff0c;应该都有过这种经历&#xff1a;导师布置完任务&#xff0c;甩一句“先去读点相关文献&#xff0c;整理一下这个方向的研究现状”&#xff0c;转头自己就对着空白文档发呆——不知道从哪找文献&#xff0c;下了几十篇分不清主次&#xff0…...

法大大:新一代合同管理数智化服务商

深圳法大大网络科技有限公司是一家专注于电子合同及智能合同管理服务的科技企业&#xff0c;业务覆盖中国全境、港澳大湾区及全球超过100个国家和地区。公司通过电子签名技术与智能管理系统&#xff0c;为企业提供从合同起草、签署、归档到证据保全的全流程数字化解决方案&…...