观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

news2024/12/27 11:59:57

大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助;

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

观察者模式 (Observer Pattern)发布-订阅模式 (Publish-Subscribe Pattern) 都是常见的设计模式,主要用于实现事件驱动的通信机制,通常用于解耦组件之间的依赖关系,促进松耦合的架构设计。虽然这两种模式有一些相似之处,但它们在结构、实现方式以及适用场景上有一些关键的区别。

1. 观察者模式 (Observer Pattern)

定义:

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象(主题,Subject)的状态发生变化时,所有依赖于它的对象(观察者,Observer)都会被自动通知并更新。这种模式常用于实现事件驱动的系统,在某个对象的状态发生改变时,其他对象需要响应这些变化。

结构:
  • Subject (主题):被观察的对象,维护着所有依赖它的观察者。
  • Observer (观察者):依赖于Subject的对象,当Subject发生变化时,观察者会得到通知并做出相应更新。
  • ConcreteSubject (具体主题):具体的被观察者,它会通知所有的观察者。
  • ConcreteObserver (具体观察者):具体的观察者,它会对Subject的状态变化做出响应。
优点:
  • 松耦合SubjectObserver之间没有强依赖关系,Subject只需知道Observer的接口,而不关心具体的实现。
  • 可扩展性强:新的观察者可以方便地加入系统中,不需要改变现有的代码。
缺点:
  • 可能产生过多的更新:如果Subject状态变化频繁,可能会导致大量的通知,影响性能。
  • 观察者不当管理:如果观察者没有正确地管理其生命周期(比如注销不再需要的观察者),可能会导致内存泄漏。
使用场景:
  • GUI框架中的事件监听,比如按钮点击、窗口状态变化。
  • MVC框架中的数据模型和视图的更新。
  • 发布状态变化时通知多个不同的处理器。

2. 发布-订阅模式 (Publish-Subscribe Pattern)

定义:

发布-订阅模式是一种消息传递模式,它允许一个组件(发布者)将消息发布到一个消息系统(消息代理),然后其他订阅者可以订阅这些消息并接收通知。它的核心思想是“发布”和“订阅”是解耦的,发布者不知道有多少订阅者,订阅者也不关心消息的来源。

结构:
  • Publisher (发布者):消息的发布者,负责发布消息。
  • Subscriber (订阅者):消息的订阅者,接收感兴趣的消息。
  • Message Broker (消息中介):中介系统,负责将发布的消息分发给所有订阅者。发布者与订阅者之间通过这个消息中介进行间接通信。
优点:
  • 松耦合:发布者和订阅者之间没有直接的依赖关系,发布者不知道有多少个订阅者,也不关心它们的具体实现。
  • 灵活性高:订阅者可以根据需要选择订阅特定的消息类型,并且可以随时添加或删除订阅者。
  • 异步处理:消息可以异步传递,不会直接影响发布者的执行流。
缺点:
  • 消息中介的复杂性:引入了消息中介,可能增加系统的复杂性和维护成本。
  • 潜在的消息丢失问题:如果没有可靠的消息传递机制,可能会出现消息丢失或延迟的问题。
  • 消息顺序问题:订阅者收到消息的顺序可能无法保证,尤其在分布式系统中。
使用场景:
  • 事件驱动系统,如推送通知、消息队列(例如Kafka、RabbitMQ)。
  • 微服务架构中的异步通信。
  • 游戏开发中的玩家事件通知、多人实时互动。
  • 实时数据流和日志系统。

3. 异同点

特性观察者模式 (Observer)发布-订阅模式 (Publish-Subscribe)
耦合程度松耦合,但Subject知道所有的Observer松耦合,PublisherSubscriber之间没有直接关系
依赖关系SubjectObserver之间直接依赖PublisherSubscriber之间通过消息中介解耦
消息传递方式直接通知观察者,通常是同步的通过消息代理中介,通常是异步的
消息过滤观察者自己决定是否响应Subject的变化订阅者订阅特定类型的消息,可以精确过滤消息内容
使用场景用于小范围的事件通知,适用于单一主题和观察者的场景用于多主题和多订阅者的场景,适用于消息传递和异步处理
复杂度较简单,通常应用于较小规模的应用程序或组件更复杂,常用于分布式系统、大规模的消息传递系统

4. 选择使用观察者模式或发布-订阅模式的考虑

  • 观察者模式:如果你的系统中只有一个“主题”对象需要通知多个“观察者”对象,并且这些观察者需要对该主题的状态变化做出响应,观察者模式通常更简单直接。比如在GUI系统中,一个按钮被点击后,需要通知多个不同的监听器,使用观察者模式即可。

  • 发布-订阅模式:如果你的系统中有多个消息来源和多个独立的订阅者,或者需要通过中介(如消息队列)实现异步消息传递,并且需要处理不同类型的事件或消息,发布-订阅模式会更加灵活和适用。比如在分布式系统中,各个微服务之间通过消息队列进行通信和数据同步时,通常使用发布-订阅模式。

总结:

  • 观察者模式 更侧重于一个对象的状态变化需要通知多个依赖对象的场景,适合用在较为简单的事件通知机制中。
  • 发布-订阅模式 更适合复杂的消息传递系统,特别是需要支持多个发布者和订阅者之间异步通信时,具有更高的扩展性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# OpenCvSharp DNN 卡证检测矫正

目录 说明 效果 模型 项目 代码 下载 参考 说明 源码地址:https://modelscope.cn/models/iic/cv_resnet_carddetection_scrfd34gkps 在实人认证、文档电子化等场景中需要自动化提取卡证的信息,以便进一步做录入处理。这类场景通常存在两类问题&…

前端入门之VUE--ajax、vuex、router,最后的前端总结

前言 VUE是前端用的最多的框架;这篇文章是本人大一上学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。本人不是学前端的,这个是大一的时候上学的和做的笔记,那个时候学的也蒙,故这里对前端做一个总…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …

RocketMQ的集群架构是怎样的?

大家好,我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助; RocketMQ的集群架构是怎样的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 是阿里巴巴开源的分布式消息中间件,广泛用于处…

使用DynadotAPI查看域名清仓中的过期域名列表

前言 Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮箱&…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

🎀🎀🎀uni-app 跨端开发系列 🎀🎀🎀 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

探索 Pencils Swap 的叙事:为 DeFi 的再次爆发蓄力

Pencils Protocol 最初是 Scroll 生态上一个综合性的 DeFi 平台,以 Farming、Vaults 以及 Auction 等系列产品板块为基础,其不仅成为了 Scroll 上重要的流动性、收益枢纽,同时也是重要的 LaunchPad 市场以及流量池,为 Scroll 生态…

基于STM32单片机矿井矿工作业安全监测设计

基于STM32单片机矿井矿工作业安全监测设计 目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块技术详情介绍总结 1. 项目开发背景 随着矿井矿工作业环境的复杂性和危险性逐渐增加,矿井作业安全问题引起了社会各界的广泛关注。传统的…

数学建模与数学建模竞赛

什么是数学建模? 数学建模是通过数学的方法和工具,对现实世界的一个特定对象,依据其内在规律,做出一些必要的简化假设,从而建立一个数学结构的过程。数学建模的历史和数学的起源几乎同步开始,2000多年前&a…

stm32四联七段数码管,LED8*8点阵

一、七段数码管的整体代码和仿真 1)代码 seg74.c #include "stm32f10x.h" // Device headervoid seg74_init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说,dubbo就像是个看不见的手,负责专门从注册中心nacos调用注册到nacos上面的服务的,因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

“AI智能安全管理系统:让安全无处不在

嘿,大家好!今天咱们来聊聊一个超级酷炫又至关重要的东西——AI智能安全管理系统。想象一下,如果有一个系统可以像私人保镖一样24小时不间断地保护你和你的财产,是不是感觉特别安心?这就是AI智能安全管理系统带给我们的…

【hackmyvm】soul靶机wp

tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…

PaddleOCR训练自己的私有数据集(包括标注、制作数据集、训练及应用)

目录 一、制作数据集 1、进入到PaddleOCR-releas-2.7目录 2、首先启用PPOCRLabel:在终端激活环境 3、接着点击左下角的自动标注 4、确认完成后点击左上角 5、新建gen_ocr_train_val_test.py 二、训练文字检测模型 1、模型下载 2.、配置ppocr检测模型文件 …

网络层协议--ip协议

目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由:在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…

区块链期末复习3.2:比特币脚本

目录 一、输入输出脚本的执行 二、简单脚本实例及压栈过程 1.P2PK(pay to public key hash) 2、P2PH(pay to public key hash) 3.多重签名 4.比特币脚本的应用: 三、其他常见指令 1.OP_EQUAL与OP_EQ…

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端,进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…

CUDA各种内存和使用方法

文章目录 1、全局内存2、局部内存3、共享内存3.1 静态共享内存3.2 动态共享内存 4、纹理内存5、常量内存6、寄存器内存7、用CUDA运行时API函数查询设备CUDA 错误检测 1、全局内存 特点:容量最大,访问延时最大,所有线程都可以访问。 线性内存…

青少年科普教学系统平台的设计与实现springboot

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安…

Vue2:v-for创建echart图表时不能使用动态ref,要使用动态id

项目中需要创建一组图表+表格的组合,一共15组,为了便于维护,希望使用v-for来创建,而不是写出15组<div>,但是动态指定echart的ref时,频繁遭遇init失败,提示“TypeError: this.dom.getContext is not a function”。过程记录如下。 实现效果 要实现的效果如下图,…