JavaScript发布-订阅模式与开发实践(中)

文章介绍了发布-订阅模式在前端开发中的应用,通过DOM事件和自定义事件的例子阐述其工作原理。作者通过一个简单的JavaScript类实例展示了如何实现一个发布-订阅模式,并提到在实际使用中需要考虑的优化问题,如防止重复订阅和条件通知。此外,还提到了Vue框架中的响应式原理与发布-订阅模式的关联。
摘要由CSDN通过智能技术生成

前言

作为一个前端切图仔,少有和各类设计模式打交道。但这不影响我们学习设计模式的思维,来提升我们的代码水平。

本章通过讲解发布-订阅模式,希望能够让你对设计模式更一步的学习。

本章学习内容👇

  • 发布-订阅模式在前端的运用

发布-订阅模式在前端的运用

DOM事件

javaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式。

事件模型是?🤔

其实很简单,我们只要在DOM节点上绑定一个事件函数就组成了事件模型。这也符合我们发布-订阅模式:

  • 事件函数作为订阅者,订阅DOM节点的事件
  • DOM节点作为发布者,在触发事件时通知事件函数

接下来,我们在浏览器中尝试下这一点👇

document.addEventListener('click',function (){
    alert('触发订阅')
},false)
​
document.body.click()//触发订阅

通过订阅(监听)浏览器文档模型的点击事件,并传入一个供给通知状态的事件函数,完成了发布—订阅模式。

自定义事件

除了**DOM事件**外,我们还经常会实现一些自定义的事件。

什么是自定义事件呢?简单来说就是对象之间的关联,一个对象监听另外一个对象的属性,围绕属性变化展开发布—订阅。

这种实现非常常见,比如说Vue中的响应式原理就是基于依赖注入实现的。

对这部分感兴趣的读者可以参考:Vue2响应式原理以及实现》

现在,我们一起来实现一个简单的发布-订阅模式。首先想想这个模式应该如何逐步实现?

  • 首先需要一个发布者和若干个订阅者
  • 然后发布者需要添加一个缓存池,池中对应着每个订阅者相应的回调函数
  • 当事件发生/状态改变时,发布者会遍历这个缓存池,依次通知对应的订阅者(触发对应的回调函数)

代码如下👇

class Publisher{
    constructor() {
        this.cache = []
    }
​
    dependent(callback){
        this.cache.push(callback)
    }
​
    trigger(){
       this.cache.forEach((callback)=>{
           callback()
       })
    }
}
​
let publisher = new Publisher()
​
let subscriber1 = {
    name:'one',
}
​
let subscriber2 = {
    name:'two'
}
​
publisher.dependent(()=>{console.log(subscriber1.name)})
publisher.dependent(()=>{console.log(subscriber2.name)})
​
publisher.trigger()

控制台输出

one
two

这样我们就成功实现了一个发布-订阅模式了🤩

不过,这只是简单版本的。严格来讲我们还需要在订阅时,判断是否重复订阅/只在必要时通知等等

尾声

通过本章,相信之前不了解发布-订阅模式的你已经能够从一个网页中发现许多的发布-订阅模式了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值