面向对象设计与分析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盘中的。如果我们在以…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
