设计模式 ~ 发布订阅者

news2024/11/24 4:52:50

发表订阅者模式

用于实现对象之间的松耦合通信;
在该模式中,存在一个或多个发布者(Publishers)和一个或多个订阅者(Subscribers);
发布者负责发布消息,而订阅者负责订阅感兴趣的消息并在接收到消息时做出相应的处理。

对比观察者模式

Subject 和 Observer 直接绑定,中间无媒介;
Publisher 和 Observer 相互不认识,中间有媒介;
在这里插入图片描述

代码演示

function PubSub() {
  this.subscribers = {}
}

subscribe 方法,订阅者可以注册自己来接收特定事件的通知;
unsubscribe 方法,订阅者可以取消对特定事件的订阅;
publish 方法,发布者可以发布特定事件及其相关的数据。

PubSub.prototype = {
  subscribe: function (event, callback) {
    if (!this.subscribers[event]) {
      this.subscribers[event] = []
    }
    this.subscribers[event].push(callback)
  },
  unsubscribe: function (event, callback) {
    if (this.subscribers[event]) {
      var index = this.subscribers[event].indexOf(callback)
      if (index !== -1) {
        this.subscribers[event].splice(index, 1)
      }
    }
  },
  publish: function (event, data) {
    if (this.subscribers[event]) {
      this.subscribers[event].forEach(function (callback) {
        callback(data)
      })
    }
  }
}

创建实例

const pubsub = new PubSub()

订阅

pubsub.subscribe('message', function (data) {
  console.log('收到消息:', data)
})

发布

pubsub.publish('message', '发布消息 ~~~')

VUE

Vue2 实例本身就支持自定义事件,但 Vue3 不再支持;
推荐使用 mitt ,文档 https://github.com/developit/mitt;
mitt 没有 once ,也可以使用 event-emitter https://www.npmjs.com/package/event-emitter

创建单独的 .js 文件、保证单例性

import mitt from 'mitt'
const emitter = mitt() // 单例
export default emitter

发布和订阅

emitter.on('change', () => {
    console.log('change')
})
emitter.emit('change')

即时销毁

created() {
    emitter.on('change', this.fn)
},
beforeUnmount() {
    emitter.off('change', this.fn)
}

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

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

相关文章

C++中的“三重”

博文内容:重载、重定义(隐藏),重写(覆盖) 三重区别及联系 概念联系及区别1、作用域2、函数要求 概念 重载 函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。 …

如何应对黑产进行验证图片资源遍历

第一期,我们分享的攻防点是:验证图片资源遍历。 “遍历”指黑产通过穷举法获得所有验证码图片的答案,以便能在未来彻底无视验证码。由于验证码主要是通过图片语义答案来识别人机,因此攻破这层防御最有效的方式就是遍历该验证码图…

【电路原理学习笔记】第4章:能量与功率:4.4 能量转换与电阻的电压降

第4章:能量与功率 4.4 能量转换与电阻的电压降 图4-11以电子作为电荷进行举例说明,电子从电池的负极流过电路,然后流回正极。当它们从负极出来时,电子具有最高的能量水平。电子流经过每个电阻,这些电阻连接在一起形成…

微信要怎么定时自动发布朋友圈呢?

大家都知道,朋友圈营销在当今十分重要。对于那些做了私域的人来说,他们知道这可以给自己带来多少的收益。最近,很多客户都纷纷向我咨询朋友圈发圈的问题。客户们认为朋友圈多号操作很费事,拥有多个号容易漏发;若看到同…

【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解 1.创建Ceph对象存储系统RGW接口2. 开启httphttps,更改监听端口3. 更改监听端口4.S3接口访问测试5.实验中遇到的故障案例 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph对象存储系统RGW接口 (1)对象存储概念 对象存…

【C语言】杨氏矩阵中寻找元素

题目名称: 杨氏矩阵 题目内容: 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从下到上递增的(杨氏矩阵的定义),请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

基于51单片机和proteus的八路抢答器系统

此系统是基于51单片机和proteus的仿真设计,功能如下: 1. 分别采集八路抢答器按键输入信号和系统按键信号。 2. 检测到按键输入后蜂鸣器发出提示音。 3. 数码管显示八路中首次按下的按键。 4. 重置按键可重置系统,重新抢答。 功能框图如下…

【文生图系列】stable diffusion webui 汉化(双语)教程

文章目录 安装双语插件下载json源文件设置双语 这篇博文记录于我成功安装双语插件之后,所以以下的示例页面均是双语。汉化教程分为三步,安装插件,JSON源文件下载和最后一步的双语设置。 安装双语插件 在扩展(extensions&#xf…

HCIA作业(一)

题目 实现Client1能够通过域名www.baidu.com来获取Serverlet1(Http服务器)所放置的文件 配置信息 Servlet1配置: PC1配置: PC2配置: Client1配置: Servlet2配置: AR1配置: 结果

ceph集群(二)

ceph 一、资源池 Pool 管理二、创建 CephFS 文件系统 MDS 接口三、创建 Ceph 块存储系统 RBD 接口四、创建 Ceph 对象存储系统 RGW 接口五、OSD 故障模拟与恢复 一、资源池 Pool 管理 上次我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢&#x…

problem(1):VMware网络虚拟编辑器添加VMnet0+IDA远程调试

VMware网络虚拟编辑器添加VMnet0 桥接模式:由于VMnet0是跟桥接模式有关系的,是ping通的条件,所以很重要。是IDA远程调试的 关键(remote window debugger) NAT模式:外部网络(桥接模式&#xff…

Pyhon:串口应用及数据解析过程

Pyhon:串口应用及数据解析过程 串口通信是一种常用的通信协议,本文重点记录在Python中使用串口,并且以一款电源保护板的串口数据协议为例,对其进行解析,记录收发过程中对16进制数据进行转换的过程。 1. 调用串口 在Python中进行…

浅谈HTTPS抓包原理,为什么Charles能够抓取HTTPS报文?

Charles作用其实相当于拦截器,当客户端和服务器通信时,Charles其实会先接收到服务器的证书,但是它会自己生成一个证书发送给客户端(不管是Web端或App应用),也就是说它不仅仅是拦截,甚至还可以修改。 由于Charles更改了…

[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)

目录 1、常见的排序算法 1.1 交换排序基本思想 2、快速排序的实现方法 2.1 基本思想 3 hoare(霍尔)版本 3.1 实现思路 3.2 思路图解 3.3 为什么实现思路的步骤2、3不能交换 3.4 hoare版本代码实现 3.5 hoare版本代码测试 4、挖坑法 4.1 实现…

SpringCloud(六)Config配置中心

一、配置中心 官方文档:**https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ 经过前面的学习,我们对于一个分布式应用的技术选型和搭建已经了解得比较多了,但是如果我们的微服务项目需要部署很多个实例&#xff0c…

基于时域特征和频域特征组合的敏感特征集,再利用SVM或KNN传统分类器进行轴承故障诊断(python编程,代码有详细注释)

1.文件夹介绍(使用的是CWRU数据集) 0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。 这里以打开0HP文件为例进行展示,creat_data.py是处理原始数据的脚本,负责将原始数据切不重叠割成1024的固…

postgresql导入导出数据库的一些问题

新建一个数据库 别忘了添加空间数据的扩展 备份之前的数据库 注意一定要自定义表,去掉 spatial_ref_sys ,要不然需要先drop在创建,可能会报错。 一般不会去导函数,如果有个别自己创建的函数可以手动复制一下,全部导的话…

联合接地的概念和优势——通信设备的“保命秘籍”

夏日炎炎,强对流天气多发,雷电灾害也需要引起关注。雷电是大气中的超长距离放电过程。雷电有着强大的电流、炙热的高温、强烈的电磁辐射以及猛烈的冲击波,这让其能够瞬间变身“无敌破坏王”,造成雷电灾害。如若强大的瞬间过电压冲…

【Python爬虫开发基础⑭】Scrapy架构(组件介绍、架构组成和工作原理)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡往期推荐: ⭐️前面比较重要的基础内容: 【Python爬…

【C++】开源:跨平台轻量日志库easyloggingpp

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…