观察者模式与发布-订阅模式的对决

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 摘要:
    • 引言:
    • 正文:
      • 1️⃣ 观察者模式
      • 2️⃣ 发布-订阅模式
      • 3️⃣ 观察者模式与发布-订阅模式的异同
    • 参考资料:

摘要:

本文将深入探讨观察者模式和发布-订阅模式,分析它们的异同、应用场景以及优缺点。通过了解这两种模式,我们可以更好地应对不同的开发需求,选择合适的模式来实现代码的解耦和模块化。

引言:

在软件工程中,为了实现代码的解耦和模块化,我们常常会用到一些设计模式。观察者模式和发布-订阅模式是最常用的两种模式,它们在某些方面有着相似之处,但在实际应用中又存在差异。本文将详细介绍这两种模式,帮助大家在实际开发中做出合适的选择。

正文:

1️⃣ 观察者模式

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

  • 优点:实现了对象之间的解耦,提高代码的可维护性和可扩展性。
  • 缺点:观察者和被观察者之间的高度耦合,可能导致代码的复杂性增加。

观察者模式是一种设计模式,允许一个对象(称为“主题”)注册一个或多个其他对象(称为“观察者”)以便在某个事件发生时被通知。

以下是一个简单的JavaScript观察者模式代码示例:

// 主题构造函数
function Subject() {
  this.observers = []; // 数组用于存放观察者对象
}

// 注册观察者
Subject.prototype.subscribe = function(observer) {
  this.observers.push(observer);
};

// 移除观察者
Subject.prototype.unsubscribe = function(observer) {
  const index = this.observers.indexOf(observer);
  if (index > -1) {
    this.observers.splice(index, 1);
  }
};

// 通知所有观察者
Subject.prototype.notify = function(data) {
  this.observers.forEach(observer => observer.update(data));
};

// 观察者构造函数
function Observer(name) {
  this.name = name;
}

// 观察者更新方法
Observer.prototype.update = function(data) {
  console.log(`${this.name} received notification:`, data);
};

// 创建主题实例
const subject = new Subject();

// 创建观察者实例
const observer1 = new Observer("Observer 1");
const observer2 = new Observer("Observer 2");

// 注册观察者
subject.subscribe(observer1);
subject.subscribe(observer2);

// 通知观察者
subject.notify("Hello, observers!");

在这个示例中,我们创建了一个主题(Subject)构造函数和一个观察者(Observer)构造函数。主题具有订阅(subscribe)、移除(unsubscribe)和通知(notify)观察者的方法。观察者具有更新(update)方法。

然后我们创建了主题和观察者的实例,并注册观察者到主题。最后,我们通过调用主题的notify方法来通知观察者。

2️⃣ 发布-订阅模式

发布-订阅模式是一种消息传递模式,它允许发布者发送消息到消息队列,而订阅者可以订阅感兴趣的消息并接收通知。

  • 优点:实现了发布者和订阅者之间的完全解耦,提高了代码的模块化和灵活性。
  • 缺点:可能导致系统的性能开销增加,因为需要维护一个消息队列。

发布-订阅模式是一种设计模式,允许一个对象(发布者)发布消息,其他多个对象(订阅者)监听并接收这个消息。

以下是一个简单的JavaScript发布-订阅模式代码示例:

// 发布者构造函数
function Publisher() {
  this.subscribers = {}; // 对象用于存放订阅者及其回调函数
}

// 发布消息
Publisher.prototype.publish = function(topic, data) {
  if (this.subscribers[topic]) {
    this.subscribers[topic].forEach(subscriber => subscriber(data));
  }
};

// 订阅者构造函数
function Subscriber(name) {
  this.name = name;
}

// 订阅消息
Subscriber.prototype.subscribe = function(topic, callback) {
  if (!this.publisher.subscribers[topic]) {
    this.publisher.subscribers[topic] = [];
  }
  this.publisher.subscribers[topic].push(callback);
};

// 创建发布者和订阅者实例
const publisher = new Publisher();
const subscriber1 = new Subscriber("Subscriber 1");
const subscriber2 = new Subscriber("Subscriber 2");

// 订阅消息
subscriber1.subscribe("topic1", data => {
  console.log(`${subscriber1.name} received message:`, data);
});

subscriber2.subscribe("topic1", data => {
  console.log(`${subscriber2.name} received message:`, data);
});

// 发布消息
publisher.publish("topic1", "Hello, subscribers!");

在这个示例中,我们创建了一个发布者(Publisher)构造函数和一个订阅者(Subscriber)构造函数。发布者具有发布(publish)消息的方法,订阅者具有订阅(subscribe)消息的方法。

然后我们创建了发布者和订阅者的实例,并让订阅者订阅发布者的消息。最后,我们通过调用发布者的publish方法来发布消息,订阅者将接收到这个消息。

3️⃣ 观察者模式与发布-订阅模式的异同

虽然观察者模式和发布-订阅模式在功能上有些相似,但它们在实际应用中存在一些差异:

  • 耦合度:观察者模式中的观察者和被观察者是直接关联的,而发布-订阅模式中的发布者和订阅者是通过消息队列进行通信的,实现了更低的耦合度。
  • 灵活性:发布-订阅模式更加灵活,因为它允许订阅者动态地订阅和取消订阅消息。
    总结:观察者模式和发布-订阅模式都是实现代码解耦和模块化的有效手段。在实际开发中,我们需要根据项目需求和场景来选择合适的模式。观察者模式适用于对象间高度耦合的场景,而发布-订阅模式适用于需要高度解耦和模块化的场景。

参考资料:

  • “设计模式:观察者模式和发布-订阅模式”,极客时间,2022
  • “深入理解观察者模式和发布-订阅模式”,掘金,2021

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb网上零食销售系统

1 绪 论 目前,我国的网民数量已经达到7.31亿人,随着互联网购物和互联网支付的普及,使得人类的经济活动进入了一个崭新的时代。淘宝,京东等网络消费平台功能的日益完善,使得人们足不出户就可以得到自己想要的东西。如今…

PCB学习记录---原理图

一、注释 NC:no connect,默认不连接 NF: no fix,默认不安装 0R: 0R的电阻,即可以短路 二、看图流程 1、看标题,了解功能 2、浏览有几个模块 3、找芯片对应的数据手册,了解芯片功能和使用 例如CH224&#xff…

gradio简单搭建——关键词匹配筛选【进一步优化】

gradio简单搭建——关键词匹配筛选[进一步优化] 任务回顾新的想法:无效元素筛选界面搭建数据处理与生成过程交互界面展示 任务回顾 在 apply \text{apply} apply方法的使用一节中,简单提到了任务目标:通过关键词的形式,在文本数据…

Harmony鸿蒙南向驱动开发-DAC

DAC(Digital to Analog Converter)是一种通过电流、电压或电荷的形式将数字信号转换为模拟信号的设备。 DAC模块支持数模转换的开发。它主要用于: 作为过程控制计算机系统的输出通道,与执行器相连,实现对生产过程的自…

【讲解下Fiddler的安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

支小蜜校园刷脸支付系统的优势在哪里?

在当今社会,校园欺凌问题日益受到人们的关注。校园欺凌不仅影响学生的身心健康,还可能导致其产生厌学、逃学甚至报复社会的行为。建立校园防欺凌系统对于学校而言,具有极其重要的意义。本文将详细探讨校园防欺凌系统对学校的好处。 一、保障…

3.1 基本形式 机器学习

从本章本节开始就开始正式介绍机器学习的算法了!我们首先登场的是---------线性模型。 w可以理解为权重,我们的x就是我们的样本点的各个特征数值,最后输出模型f(x)。其代表我们把样本点带入,以二分类为例&a…

金三银四面试题(十七):MySQL面试都问什么(2)

今天我们继续盘点那些高频的MySQL面试题。 说说InnoDB与MyISAM的区别 InnoDB 支持事务,MyISAM 不支持,对于InnoDB 每一条SQL 语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL 语言放在begin 和comm…

密码学基础--搞清RFC和PKCS(1)

目录 1. CryptoDriver里KeyElement格式 2. 挖掘RFC标准 3.小结 昨天从生成密钥对开始逐步了解了公钥、证书等各种编码方式,今天继续趁热打,做一个理论知识汇总。 Ps:我只是标准的翻译搬运工。 1. CryptoDriver里KeyElement格式 在 CryptoKeyElemen…

基于达梦数据库开发-python篇

文章目录 前言一、搭建demo前提初始化简单demo 二、可能出现的异常情况DistutilsSetupErrorNo module named dmPythonlist报错 总结 前言 出于信创的考虑,近年来基于国产数据库达梦的应用开发逐渐变多。本文将介绍在windows环境下基于DM8版本的python的简单开发使用…

【自控笔记】线性系统时域分析法

动态稳态性能 一阶系统 二阶系统 二阶系统单位阶跃 系统稳定性分析

【优选算法专栏】专题四:前缀和(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

还不会免费将PDF转为Word?赶快试试这3种工具!

PDF文档格式转换是高频且刚需的办公需求,虽然很简单,但其实绝大部分人找不到合适的工具。 将PDF免费转为Word的方法有很多,这里主要介绍三种工具。 第一种使用最常见的Word软件,第二种使用免费转换网站pdf2doc,第三种…

cmocka入门教程

文章目录 摘要前言什么是mockmock示例cmocka安装使用mock function替换subfunction控制mock function的输入和输出 摘要 本文介绍cmocka中,mock的使用。 前言 在这之前,需要了解最基本的cmocka使用。如果之前有gtest的编程经验,掌握cmocka的…

蓝桥杯 迷宫(bfs)

0迷宫 - 蓝桥云课 (lanqiao.cn) 思路 : 最后一定要倒数输出路径,因为从前面输出你会找不到下一个到底是谁,bfs过程是找最小路径,最后输出是去找方向,但是此题作为一个填空题,我直接手写(开玩笑…

对于Redis,如何根据业务需求配置是否允许远程访问?

1、centos8 Redis安装的配置文件目录在哪里? 在 CentOS 8 中,默认情况下 Redis 的配置文件 redis.conf 通常位于 /etc/ 目录下。确切的完整路径是 /etc/redis.conf。 2、redis如何设置允许远程登录 修改redis.conf文件 # 继承默认注释掉的bind配置 # …

十种mfc140.dll丢失的解决方法,有效解决mfc140.dll丢失的问题

唉,烦人的问题又来了。怎么计算机报错提示mfc140.dll无法启动?这mfc140.dll是何方神圣,竟然连软件程序的正常运行都能影响到?我猜你也被这种困扰搞得头大吧。别着急,下面我会详细分享mfc140.dll丢失时的修复步骤&#…

Android平台RTSP|RTMP播放器如何实现TextureView渲染

技术背景 自2015年我们发布Android平台RTSP、RTMP直播播放模块以来,渲染这块,支持SurfaceView或GlSurfaceView,当然如果开发者需要TextureView渲染,可以把RTSP、RTMP流数据解码回调YUV或RGB数据上来,上层自己渲染。本…

pycharm一直打不开

一直处在下面的页面,没有反应 第一种方案: 以管理员身份运行 cmd.exe;在打开的cmd窗口中,输入 netsh winsock reset ,按回车键;重启电脑;重启后,双击pycharm图标就能打开了&#xf…

阿里淘天一面凉经

电话面,秒挂。 由于答的依托。导致面试官一开始就准备要挂我了。后面问的参考性不大。 总结: 1.自我介绍 2.项目里自己体会比较多的,遇到困难比较大的技术实现。(没复习) 3.项目中什么场景下用到分布式锁&#xf…