面向对象设计与分析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盘中的。如果我们在以…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
