说完观察者模式和发布订阅模式的区别,面试官不留我吃饭了

简介: 说完观察者模式和发布订阅模式的区别,面试官不留我吃饭了

观察者模式


观察者模式一般有观察者和被观察者。举个例子:大家在学校上自习的时候,等老师走了有些人会玩手机、吃零食、交头接耳找隔壁妹妹聊天,但是被老师发现可就不好了,所以大家想了一个招,让坐在最后排的同学帮忙“放风”,老师一来就给大家一个手势通知大家,大家就继续装好好学生(哈嘿)。

image.png

这其实就是一个典型的观察者模式,“放风”的同学是被观察者,玩手机、吃零食的同学是观察者,大家都在观察“放风”同学的手势,一旦老师来了,被观察者就会通知大家。


好了,让我们看看 UML 建模是如何定义的。


观察者模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。


UML结构图如下:

image.png

Subject类是主题,它把所有对观察者对象的引用文件存在了一个集合里,每个主题都可以有任何数量的观察者。它是一个抽象主题,提供了一个可以增加和删除观察者对象的接口。


Observer类是抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。


ConcreteSubject类是具体主题,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。


ConcreteObserver是具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协同。


发布订阅模式


举个生活中的例子,比如我们想要订阅一份国家地理杂志,一般需要我们先向邮局申请(付钱),告诉邮局我要订阅这份杂志,苦等数日杂志终于印刷好了,这个时候我们不会直接跑到印刷厂里去,而是等印刷厂将杂志送给邮局,然后邮局才会慢吞吞地将杂志送到家(推模式),如果你实在等不及了跑到邮局直接取杂志,恭喜你学会了“拉模式”。

image.png

用专业术语来解释发布订阅模式:


订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码。

image.png

在发布订阅模式里发布者并不会直接通知订阅者,换句话说发布者和订阅者彼此互不感知。


那发布者和订阅者如何交流呢?答案是通过中间的调度中心。

  • 发布者将消息发送给调度中心,告诉它你帮我把消息放到 Topic1中。
  • 订阅者告诉调度中心,我需要订阅 topic1,你帮我留意一下。
  • 当有消息来了,订阅者可以采取拉模式或者推模式来获取消息。


有态度的总结


话不多说,先上一张图:

image.png

从表面上看:

  • 观察者模式里只有两个角色:观察者和被观察者。
  • 发布订阅模式里有三种角色:发布者、订阅者、调度器(第三者)。


往更深层次讲:

  • 观察者和被观察者是松耦合的关系。
  • 发布者和订阅者则完全不存在耦合。


从使用层面上讲:

  • 观察者模式经常用于单个应用内部。
  • 发布订阅模式更多是一种跨应用的模式(cross-application pattern),比如我们常用的消息中间件Kafka 等。


综上:观察者模式和发布订阅模式本质上都有发布订阅的思想,但是又有一定的区别,所以我们不能将二者完全等同起来。


目录
打赏
0
0
0
0
4
分享
相关文章
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
118 9
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
100 12
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
51 9
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
121 14
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
经典面试题:变量的声明和定义有什么区别
在编程领域,变量的“声明”与“定义”是经典面试题之一。声明告诉编译器一个变量的存在,但不分配内存,通常包含变量类型和名称;而定义则为变量分配内存空间,一个变量必须至少被定义一次。简而言之,声明是告知变量形式,定义则是实际创建变量并准备使用。
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
426 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
150 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等