面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型
文章目录
- 消息驱动编程
- 事件驱动编程
- 消息驱动和事件驱动的区别
消息驱动编程
消息驱动是一种编程模型,它基于事件和消息的传递来驱动程序的执行流程。在消息驱动的模型中,系统中的各个组件(或对象)通过发送和接收消息进行通信和协作。
在消息驱动的架构中,组件之间的交互是通过发送和接收消息来实现的。当一个组件在完成某个任务后,它可以将消息发送给其他组件,通知它们做出相应的响应或执行特定的操作。而接收到消息的组件则根据消息的内容和类型做出相应的处理。
消息驱动模型具有以下特点:
- 异步性:消息的发送和接收是异步进行的,也就是说发送方不需要等待接收方的处理结果或响应。
- 解耦性:消息驱动模型可以实现组件之间的解耦,即发送者和接收者之间不需要直接引用对方的具体实现,只需通过消息传递进行通信。
- 可扩展性:由于组件之间是通过消息进行通信,因此可以很方便地实现系统的扩展和灵活调整,新增或替换组件时对其他组件的影响较小。
- 并发性:由于消息的异步性,消息驱动模型能够较好地支持并发处理,多个消息处理过程可以并行执行。
在消息驱动架构中,消息的格式是基于消费者的需求制定的;消息传递可以是一对一,多对多,一对多或多对一。
下面是消息驱动编程中的几个要素:
消息(Message):消息是信息的载体,它可以包含各种数据和指令,用于在不同组件之间传递信息。消息通常具有特定的格式和类型,以便接收方能正确地理解和处理。
发送者(Sender):发送者是产生和发送消息的组件或对象。它负责创建消息实例,并将其发送给接收者。
接收者(Receiver):接收者是接收和处理消息的组件或对象。它负责监听和接收消息,并根据消息的内容和类型执行相应的处理逻辑。
消息队列(Message Queue):消息队列是一个存储消息的缓冲区。当发送者发送消息时,消息会被放入消息队列中,等待接收者的处理。消息队列可以按照先进先出(FIFO)的原则进行消息的排队和分发。
消息驱动在许多领域中都得到了广泛应用,特别是在事件驱动编程、消息队列系统、分布式系统等领域。在安卓开发中,消息驱动机制被用于实现线程间通信、异步任务处理和定时任务等功能,提高了应用程序的性能和响应性。
事件驱动编程
事件驱动编程是一种编程范式,它以事件的发生和相应的处理为核心,通过订阅和响应事件来实现程序的逻辑控制。
在事件驱动编程中,程序的执行顺序是由事件的发生和相应的处理决定的,而不是按照传统的顺序执行。程序会监听(订阅)特定类型的事件,当这些事件发生时,程序会执行预定义的处理逻辑。
事件驱动编程有以下几个重要概念:
- 事件(Event):事件是系统或用户行为的反馈,可以是点击按钮、鼠标移动、键盘输入、网络请求完成等。事件可以以数据的形式传递,包含事件的类型、内容和附加信息等。
- 事件监听器(Event Listener):事件监听器是一个回调函数或方法,用于处理特定类型的事件。它会被注册到事件源上,当事件源触发相应的事件时,事件监听器会被调用执行。
- 事件源(Event Source):事件源是产生事件的对象或组件,它负责监测事件的发生并向注册的事件监听器发送事件通知。
- 事件处理器(Event Handler):事件处理器是负责处理事件的代码块或函数,它定义了在特定事件发生时要执行的逻辑。事件处理器可以是事先定义好的,也可以是临时定义的。

事件驱动编程的工作流程如下:
- 注册事件监听器:程序通过将事件监听器注册到事件源上,告诉系统要监听哪些事件。
- 监听事件:程序开始监听注册的事件,等待事件的发生。
- 事件触发:当某个事件发生时,事件源会通知相应的事件监听器,告诉它们有事件需要处理。
- 执行事件处理逻辑:事件监听器接收到事件通知后,执行预定义的事件处理逻辑,完成对事件的响应。
通过事件驱动编程,可以实现高度灵活和可扩展的程序设计。不同组件之间通过事件进行解耦,新的组件可以很容易地加入到系统中,只需要注册相应的事件监听器即可。事件驱动编程广泛应用于图形用户界面(GUI)、网络编程、异步任务处理和消息队列等领域。
消息驱动和事件驱动的区别
消息驱动和事件驱动是两种常见的编程模型,它们在实现组件之间的通信和协作时有一些区别。
- 概念上的区别:
- 消息驱动:消息驱动是基于消息的传递进行通信的编程模型。组件通过发送和接收消息来进行交互,发送者产生消息并将其发送给接收者,接收者根据消息的内容和类型做出相应的处理。
- 事件驱动:事件驱动是基于事件的触发和响应进行通信的编程模型。组件通过订阅(监听)某个事件,在特定事件发生时执行预定义的处理逻辑。事件的触发可以由系统、用户输入或其他组件的动作等引起。
- 关注的焦点不同:
- 消息驱动:消息驱动更关注消息本身,强调消息的发送和接收,以及消息的内容和类型。每个消息都被视为一个独立的通信单元。
- 事件驱动:事件驱动更关注事件的发生和处理,强调对事件的响应和处理逻辑。事件可以被看作是系统或用户行为的反馈。
- 解耦性和扩展性:
- 消息驱动:消息驱动模型可以实现组件之间的解耦,发送者和接收者只需通过消息进行通信,不需要直接引用对方的具体实现。这使得系统的扩展和调整更加灵活。
- 事件驱动:事件驱动模型也可以实现组件之间的解耦,组件通过订阅特定的事件来响应处理,事件的产生和处理逻辑是分离的。这样可以将新的组件加入到系统中,只需要实现相应的事件处理器即可。
总的来说,消息驱动和事件驱动都是有效的编程模型,用于实现组件之间的通信和协作。消息驱动更关注消息的发送和接收,适用于强调消息的内容和类型的情况;而事件驱动更关注事件的触发和响应,适用于强调事件发生和处理逻辑的情况,事件可以看成特化的消息。两者可以根据具体的应用场景选择使用。
相关文章:
面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型
文章目录 消息驱动编程事件驱动编程消息驱动和事件驱动的区别 消息驱动编程 消息驱动是一种编程模型,它基于事件和消息的传递来驱动程序的执行流程。在消息驱动的模型中,系统中的各个组件(或对象)通过发送和接收消息进行通信和协…...
【c语言】指针进阶(超详细)
文章目录 ✈ 指向函数指针数组的指针📌指向函数指针数组的指针的定义📌指向函数指针数组的数组指针的使用 ✈回调函数📌 回调函数的定义📌 回调函数的使用 ✈qsort函数📌 qsort函数的作用📌qsort函数的定义…...
C++入门篇8---vector
vecctor是动态顺序表 一、了解vector的相关接口及其功能 1.构造函数相关接口 函数声明功能介绍vector()无参构造vector(size_type n,const value_type& valvalue_type())构造并初始化n个valvector(const value& x)拷贝构造vector(InputIterator first, InputIterato…...
【学会动态规划】最大子数组和(19)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
怎么做Tik Tok海外娱乐公会呢?新加坡市场怎么样?
一、为什么选择TikTok直播 1. 海外市场潜力巨大 • 自2016年始,多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、欧美、拉美等地区。 • 海外市场作为直播发展新蓝海,2021年直播行业整申请cmxyci体规模达百亿美元,并维持高速增长。 &a…...
mysql主从复制搭建
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言MySQL复制过程分为三部: 一、准备工作二、配置>主库Master三、配置>从库SlaveSlave_IO_Running: YesSlave_SQL_Running: Yes 四、测试至此&am…...
Java:正则表达式案例:爬数据,重复数据替换,数据分割
使用正则表达式查找一段文本中的内容 需求:请把下面文本中的电话,邮箱,座机号码,热线都爬取出来。 String data "电话:1866668888,18699997777\n" "或者联系邮箱: boniuitcast.cn,\n" "座机…...
CF 765D Artsem and Saunders 构造
CF765D Artsem and Saunders 直接猜一种构造做法, h ( x ) h(x) h(x)的值域一定和 f ( x ) f(x) f(x)的值域一样,我们先满足 h ( g ( x ) ) f ( x ) h(g(x))f(x) h(g(x))f(x)这个条件,遍历 f ( x ) f(x) f(x),每次添加 h ( x ) h…...
DevOps系列文章 之 SpringBoot整合GitLab-CI实现持续集成
在企业开发过程中,我们开发的功能或者是修复的BUG都需要部署到服务器上去,而这部分部署操作又是重复且繁琐的工作,GitLab-CI 持续集成为我们解决了这一痛点,将重复部署的工作自动化,大大的节省了程序员们的宝贵时间。本…...
K8S系列二:实战入门
I. 配置kubectl 1.1 什么是kubectl? 官方文档中介绍kubectl是: Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。Kubectl的配置文件在$HOME/.kube目录。我们可以通过设置KUBECONFIG环境变量或设置命令参数–kubeconfig来指定其他…...
form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来
修改前,因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM,影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…...
Android Ble蓝牙App(五)数据操作
Ble蓝牙App(五)数据操作 前言正文一、操作内容处理二、读取数据① 概念② 实操 三、写入数据① 概念② 实操 四、打开通知一、概念二、实操三、收到数据 五、源码 前言 关于低功耗蓝牙的服务、特性、属性、描述符都已经讲清楚了,而下面就是使…...
.netcore grpc双向流方法详解
一、双向流处理概述 简单来讲客户端可以向服务端发送消息流,服务端也可以向客户端传输响应流,即客户端和服务端可以互相通讯客户端无需发送消息即可开始双向流式处理调用 。 客户端可选择使用 RequestStream.WriteAsync 发送消息。 使用 ResponseStream…...
【Servlet】(Servlet API HttpServlet 处理请求 HttpServletRequest 打印请求信息 前端给后端传参)
文章目录 Servlet APIHttpServlet处理请求 HttpServletRequest打印请求信息前端给后端传参 Servlet API Servlet中常用的API HttpServlet 实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service destory 服务器终止的时候会调用. //下面的注解把当前类和…...
java中右移>>和无符号右移>>>的区别
public static void main(String[] args) {byte[] dest new byte[2];dest[0] 0x15; //0001 0101dest[1] (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1,正确System.out.printl…...
牛客周赛 Round 7
目录 A 游游的you矩阵 题目: 题解: AC 代码: B 游游的01串操作 题目: 题解: AC 代码: C 游游的正整数 题目: 题解: AC 代码: D 游游的选数乘积 题目…...
R语言生存分析(机器学习)(1)——GBM(梯度提升机)
GBM是一种集成学习算法,它结合了多个弱学习器(通常是决策树)来构建一个强大的预测模型。GBM使用“Boosting”的技术来训练弱学习器,这种技术是一个迭代的过程,每一轮都会关注之前轮次中预测效果较差的样本,…...
k8s和docker简单介绍
当涉及到容器技术和容器编排时,Docker和Kubernetes是两个重要的概念。我将更详细地介绍它们以及它们之间的关系。 Docker: Docker是一种容器化技术,它允许你将应用程序及其依赖项打包到一个称为"容器"的封闭环境中。每个容器都包…...
Lua学习记录
Lua基础了解 Lua的注释通过 (-- 单行注释,--[[ ]] 多行注释)可以不加; 多个变量赋值,按顺序赋值,没有则为nil; function的简单用法,多个返回值配合多重赋值,以end为结束标志 Lua下标从1开始&…...
三分钟完美解决你的C盘内存过大爆红
一、清理回收站 二、清理桌面 建议一 不要在桌面放太多图标或者文件会占用过多的内存,可以放到其他盘建议二、 将位置移动到别的盘 三、手动删除下载文件与缓存文件 日常使用中会通过Windows下载各种文件资料到电脑中,它默认也是直接下载在C盘中的。如果我们在以…...
微电网优化调度:PSO与SSA算法的奇妙碰撞
Matlab代码:微电网的优化调度,以微电网的运行成本最小为目标进行优化,并把失负荷惩罚成本计入总目标当中,分别采用PSO算法和麻雀搜索算法(SSA算法,2020年新提出)进行优化求解,可分别…...
别再死记硬背公式了!用Matlab/Simulink手把手教你调PMSM的电流环PI参数(附模型)
永磁同步电机电流环PI参数整定实战:从理论推导到Simulink验证 在电机控制领域,永磁同步电机(PMSM)因其高效率、高功率密度等优势,已成为工业驱动和电动汽车的主流选择。而磁场定向控制(FOC)作为PMSM的核心控制策略,其性能很大程度…...
比迪丽AI绘画LaTeX集成:学术论文插图自动生成
比迪丽AI绘画LaTeX集成:学术论文插图自动生成 学术写作中,插图制作往往耗时费力,比迪丽AI绘画与LaTeX的集成让这一过程变得智能高效 1. 学术插图制作的痛点与需求 写论文的研究生们都有过这样的经历:花几天时间做实验,…...
从67到89:我是如何用YOLO-MASK清洗COCO羊数据集提升模型精度的
从67到89:YOLO-MASK数据清洗实战与COCO羊数据集优化全记录 去年夏天,当我第一次在COCO羊数据集上训练YOLOv5模型时,那些徘徊在67%左右的mAP数值就像炎热的天气一样令人烦躁。作为一个长期从事计算机视觉项目的工程师,我深知数据质…...
如何让旧款iOS设备重获新生:Legacy-iOS-Kit全攻略
如何让旧款iOS设备重获新生:Legacy-iOS-Kit全攻略 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 当你…...
开发实战:asp.net core + ef core 实现动态可扩展的分页方案
统一请求参数先定义一个公共的 QueryParameters 解决这个问题:public class QueryParameters{private const int MaxPageSize 100;private int _pageSize 10;public int PageNumber { get; set; } 1;// 限制最大值,防止前端传一个很大数值把数据库搞崩…...
3分钟搞定Blender VRM插件:从零开始创建你的虚拟角色
3分钟搞定Blender VRM插件:从零开始创建你的虚拟角色 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.0 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 还在为Blender与VRM格式的…...
告别Pyscenedetect误判!用TransNet V2精准切割视频转场(附Python实战代码)
告别Pyscenedetect误判!用TransNet V2精准切割视频转场(附Python实战代码) 视频内容创作者和开发者们,是否曾为传统视频切割工具的误判而头疼?高速运动的赛车镜头被误认为转场,长达数秒的渐变过渡被完全忽…...
Win11Debloat极速优化指南:让Windows系统重获新生的深度净化方案
Win11Debloat极速优化指南:让Windows系统重获新生的深度净化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declut…...
低配显卡也能玩转Flux.1!实测schnell版文生图效果与性能优化技巧
低配显卡也能玩转Flux.1!实测schnell版文生图效果与性能优化技巧 在AI图像生成领域,硬件门槛一直是许多创意工作者的痛点。当主流模型动辄要求RTX 3090级别的显卡时,那些使用GTX 1660甚至更低配置的用户往往只能望而却步。但Flux.1 schnell版…...
