【设计模式系列】中介者模式(十八)
一、什么是中介者模式
中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介者对象来封装一系列对象之间的交互,使这些对象不需要相互显式引用。中介者模式提供了一个中介层,用以协调各个对象之间的通信,从而减少它们之间的耦合度。
二、中介者模式的角色
-
抽象中介者(Mediator):定义了同事对象用来与中介者通信的接口,规定了中介者必须实现的方法。其作用是声明并规范中介者的操作,以便具体中介者能够实现这些操作来协调同事对象之间的交互 。
-
具体中介者(ConcreteMediator):实现抽象中介者的接口,管理同事对象的引用,并根据具体的业务逻辑处理同事之间的交互 。
-
抽象同事类(Colleague):定义同事类的接口,包含一个保存中介者对象的引用的方法以及同事对象交互的抽象方法 ,也实现所有相互影响的同事类的公共功能 。
-
具体同事类(Concrete Colleague):实现了抽象同事类的接口,是真正参与到交互中的对象。当需要与其他同事对象交互时,会通过中介者对象来进行后续的交互,而不是直接与其他同事对象通信 。
三、中介者模式的典型应用
- 事件调度和监听器管理:在需要事件调度和监听器管理的系统中,中介者模式可以用来管理事件的注册、触发和分发。
四、中介者模式在Timer中的应用
中介者模式在 java.util.Timer
类中的应用是一个典型的实例,其中 Timer
类充当中介者,而 TimerTask
任务则作为同事类。以下是详细的描述和代码示例:
-
抽象中介者(Mediator):在
Timer
的上下文中,这个接口是由Timer
类实现的,它提供了一个接口,用于调度TimerTask
对象。 -
具体中介者(ConcreteMediator):这是
Timer
类本身,它维护了一个任务队列(TaskQueue
),并使用一个内部的线程(TimerThread
)来执行这些任务。 -
抽象同事类(Colleague):在这个场景中,抽象同事类是由
TimerTask
接口实现的,它定义了任务需要执行的操作。 -
具体同事类(Concrete Colleague):这是实现
TimerTask
接口的具体任务类,它们通过Timer
类来安排自己的执行。
import java.util.Timer;
import java.util.TimerTask;// 具体同事类:实现TimerTask接口的具体任务
class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("TimerTask is executed at " + System.currentTimeMillis());}
}public class TimerMediatorPattern {public static void main(String[] args) {// 具体中介者:创建Timer对象Timer timer = new Timer();// 创建具体同事对象:创建任务MyTask task = new MyTask();// 通过中介者安排任务的执行:安排任务在3秒后执行timer.schedule(task, 3000);}
}
Timer
类是中介者,它负责管理TimerTask
对象的执行。MyTask
类是具体同事类,它实现了TimerTask
接口,并定义了任务的具体行为。- 主函数中创建了
Timer
对象和MyTask
对象,并通过Timer
的schedule
方法安排MyTask
在3秒后执行。
工作原理:
-
注册任务:通过
Timer
的schedule
方法,将TimerTask
对象和执行时间注册到Timer
中。 -
执行任务:
Timer
内部使用一个线程(TimerThread
)来监控任务队列,当任务到达指定时间时,TimerThread
会执行这些任务。 -
解耦同事类:
TimerTask
对象不需要知道其他任务的存在,也不需要直接与它们交互,所有的调度和执行都是通过Timer
完成的,这样就降低了任务之间的耦合度。
中介者模式在 Timer
类中的应用有效地将任务的调度和执行逻辑与任务的具体逻辑分离,提高了代码的模块化和可维护性 。
相关文章:
【设计模式系列】中介者模式(十八)
一、什么是中介者模式 中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介者对象来封装一系列对象之间的交互,使这些对象不需要相互显式引用。中介者模式提供了一个中介层,用以协调各个对象…...
PDF版地形图矢量出现的问题
项目描述:已建风电场道路测绘项目,收集到的数据为PDF版本的地形图,图上标注了项目竣工时期的现状,之后项目对施工区域进行了复垦恢复地貌,现阶段需要准确的知道实际复垦修复之后的道路及其它临时用地的面积 解决方法&…...
小迪安全第四十二天笔记 简单的mysql注入 mysql的基础知识 用户管理数据库模式 mysql 写入与读取 跨库查询
前言 之前的安全开发我们学习了 php联动数据库的模式 ,这个模式是现在常用的模式 这一节来学习 如何 进行数据库的注入和数据库相关知识 1、了解数据库的结构 我们使用 navicate连接数据库之后看一下 一共四层结构 库 》表》字段》数据 这个层级关系…...
11.25.2024刷华为OD
文章目录 HJ76 尼科彻斯定理(观察题,不难)HJ77 火车进站(DFS)HJ91 走格子方法,(动态规划,递归,有代表性)HJ93 数组分组(递归)语法知识…...
你真的会用饼图吗?JVS-智能BI饼图组件深度解析
在数据可视化的世界里,饼图是我们常见的一种可视化图形。在JVS-智能BI中提供了数据可视化饼图组件,接下来我通过这篇文章详细介绍,从配色方案到图形配置,从显示数据到提示信息,饼图的每一个细节配置。 饼图类图表概述…...
HarmonyOS Next 模拟器安装与探索
HarmonyOS 5 也发布了有一段时间了,不知道大家实际使用的时候有没有发现一些惊喜。当然随着HarmonyOS 5的更新也带来了很多新特性,尤其是 HarmonyOS Next 模拟器。今天,我们就来探索一下这个模拟器,看看它能给我们的开发过程带来什…...
医学机器学习:数据预处理、超参数调优与模型比较的实用分析
摘要 本文介绍了医学中的机器学习,重点阐述了数据预处理、超参数调优和模型比较的技术。在数据预处理方面,包括数据收集与整理、处理缺失值、特征工程等内容,以确保数据质量和可用性。超参数调优对模型性能至关重要,介绍了多种调…...
单片机知识总结(完整)
1、单片机概述 1.1. 单片机的定义与分类 定义: 单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…...
【C++】auto和decltype类型推导关键字
1.C11关键字 auto和decltype是C11引入的关键字,负责类型的推导。所有不同的是: auto可直接用来定义变量,编译器会自动推导出变量的类型。decltype是推导出一个操作数的类型,然后用这个类型再去定义。 2.两者区别 尽管两者都是宏…...
OGRE 3D----3. OGRE绘制自定义模型
在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…...
ARM + Linux 开发指南
随想:想写一个系列来讲如何嵌入式开发,然后能形成一个知识体系,帮助那些刚刚做嵌入开发的同学们. 1. ARM Linux从开机到Linux完全启动的流程和代码分析 ARM Linux从开机到完全启动的流程与代码分析 ARM Linux的启动过程主要涉及从设备上电开始,到Linux内核完全启动并进入…...
facebook欧洲户开户条件有哪些又有何优势?
在当今数字营销时代,Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台,广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型,包括个人广告账户、企业管理(BM&#…...
算法训练(leetcode)二刷第三十一天 | 1049. 最后一块石头的重量 II、494. 目标和、*474. 一和零
刷题记录 1049. 最后一块石头的重量 II*494. 目标和二维数组滚动数组 *474. 一和零 1049. 最后一块石头的重量 II leetcode题目地址 本题与416. 分割等和子集类似。依旧是01背包问题,本题尽可能将石头分为相等(相近)的两堆,然后…...
软件测试丨Pytest生命周期与数据驱动
Pytest的生命周期概述 Pytest 是一个强大的测试框架,提供了丰富的特性来简化测试执行。它的生命周期包括多个阶段,涉及从准备测试、执行测试到报告结果的完整流程。因此,理解Pytest的生命周期将帮助我们更好地设计和管理测试用例。 开始阶段…...
Figma入门-原型交互
Figma入门-原型交互 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,对…...
网络安全防范技术
1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能抵抗…...
Java - JSR223规范解读_在JVM上实现多语言支持
文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223(Java Spe…...
win10系统部署RAGFLOW+Ollama教程
本篇主要基于linux服务器部署ragflowollama,其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核; RAM ≥ 16 GB; 磁盘 ≥ 50 GB; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机ÿ…...
基于Python制作一个简易UI界面
基于Python制作一个简易UI界面 目录 基于Python制作一个简易UI界面1 原理简介2 编写程序3 程序测试 1 原理简介 这里用到了Python自带的UI库tkinter。 tkinter 是 Python 的标准 GUI(图形用户界面)库,用于创建和管理图形界面。它提供了一个简…...
鲁菜大师程伟华到访金宫川派味业
共工新闻社11月29日电(范琦)上周,中国鲁菜大师、首批中国烹饪大师名厨程伟华到访金宫川派味业总部基地。这位从厨51年、坚持传承鲁菜的行业大师人物,深入了解了金宫川派的品牌文化,参观了金宫自动生产车间,…...
Linux设置jar包开机自启动
本文详细描述了如何在Linux服务器上创建并配置jar包的自启动脚本,包括编辑/etc/init.d/jar_auto.sh以设置环境变量,将jar包添加到rc.local以开机启动,以及提升脚本文件权限确保自动执行。 1、准备工作 Linux中Java的路径 项目jar包绝对路径 2…...
IoTDB 常见问题 QA 第一期
开始!关于 IoTDB 的 Q&A 我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:WAL 堆积导致写入失败 问题及现象 集群报错: The write is rejec…...
【linux学习指南】linux捕捉信号
文章目录 📝前言🌠 信号捕捉的流程🌉 sigaction 🌠穿插话题-操作系统是怎么运⾏的🌉 硬件中断🌉时钟中断 🚩总结 📝前言 🌠 信号捕捉的流程 如果信号的处理动作是⽤⼾⾃定…...
git如何快速拉取已经提交的mr进行验证
参考:https://stackoverflow.com/questions/44992512/how-to-checkout-merge-request-locally-and-create-new-local-branch Pull merge request to new branch git fetch origin merge-requests/REQUESTID/head:BRANCHNAME i.e git fetch origin merge-requests/…...
【阿来来gis规划师工具箱说明书】h07四分标注
背景 在做arcmap的四分标注前,已经做好了二行三行的标注,以及在pro中做好了四分标注。这个四分标注做了好些版本,都达不到想要的效果。最终使用了静态标注的形式来做。 制作思路 新建两个承接标注文字的文本字段,考虑一般标注超…...
【大数据学习 | 面经】HDFS的三副本机制和编码机制
1. hdfs的三副本机制 hdfs的三副本机制是其核心特性之一,旨在确保数据的高可用性和容错性。通过将每个文件的数据块复制三个副本,并分散存储在不同的DateNode上,hdfs能够在节点故障的时候提供数据冗余和持续访问的能力。 三副本机制的工作原…...
lua-cjson 例子
apt install -y lua-cjson 安装 编辑 tmp.lua cjson require "cjson" p 666 d "23.42" payload{"d":[{"pres":..(p)..,"temp":"..(d).."}]} print("payload " .. payload) j cjson.decode(payloa…...
java面向对象知识点: 封装,构造,重载
目录 封装 封装知识点 private(私有) public(公共) 二、getter和setter方法 getter方法(访问器方法) setter方法(修改器方法) 三、封装类的设计原则 单一职责原则 高内聚性 一…...
go的math/rand随机数生成器
伪随机数生成器,默认情况下随机数种子是固定的, **注意:**固定的随机数种子每次生成的随机数都是相同的随机数序列 一、基础用法 math/rand 包提供了随机数生成的方法。常用的函数包括: rand.Int():返回一个伪随机…...
JiaJia-CP-1,2,3的WP(2)
一.JiaJia-CP-2 一看题目,聊天软件,用的什么聊天软件直接userassist看运行过什么程序 vol -f JiaJia_Co.raw --profileWin7SP1x64 userassist 发现Telegram.exe(小飞机) 可能性很大啊(真是个摸鱼大神) 除此之外,filescan也能看到࿰…...
哪里网站备案快/企业网站推广方案策划
试了好几个网上说的方法都不行,只有这个decode/encode方法可以,当然如果是使用PyCharm IDE的话,直接在文件开头加上# codingutf-8或者# _*_ coding: UTF-8 _*_就可以了,不需要再进行解码编码了。但是为了解决VS2015乱码问题就需要…...
中国500强企业排行榜/青岛网站seo公司
前些日子,板叔卡了山口山的审批,一大堆宅男宅女没事干,创作出了大批优秀的山口山翻唱、视频、小说、动画片,自从新版本开了后,这些创作全停下来了,没啥可看的了,《我叫MT》和《联盟的勇士》几个…...
文本资料分享网站 建设/qq群推广网站免费
S 2012 参数化报表 -- 利用拼接字符串来取代查询参数以上介绍过了如何在SQL Server中使用参数化查询,但是,如果遇到一些不支持参数化查询的数据库又该怎么办呢?此时,最终极的招数就是整个查询语句都通过参数化查询以拼接字符串的方…...
昆山推广用什么网站比较好/谷歌浏览器下载安装2021最新版
http://www.android100.net/html/201402/22/5690.html转载于:https://www.cnblogs.com/u3shadow/p/4298346.html...
做网站698靠谱吗/seo关键词优化推广价格
谷歌插件地址:https://github.com/googleads/googleads-mobile-unity/releases 测试项目流程: 生成Google Admob所有依赖的arr包、jar包(会在Plugins/Android下生成)生成后最好都单独复制出来,因为打包失败可能会清除…...
wordpress商业破解/实体店营销策划方案
1 增 http://t.zoukankan.com/star521-p-13473616.html 将查询结果插入数据库 insert into table_name select * from table_name; 为数据库表的字段添加描述 comment on column sys_user.user_name is 用户名; python中将DataFrame数据导入pgsql import …...