发布订阅模式

一、是什么

就好比你在微博上关注了一个人,然后他每次发动态的时候,你都能收到消息提示。这就是发布订阅模式,博主就是发布者,你就是订阅者。博主的粉丝就是发布者的缓存列表,每当他发表说说后,就会遍历粉丝列表,通知所有的订阅者(就是粉丝)。

二、作用和应用

松耦合

发布者和订阅者互相独立运行。能够解决负载问题。方便维护。

应用

常见应用有 图片或模块懒加载。

层级复杂的组件之间通信。

三、实现方式

实现思路:

  1. 创建一个对象
  2. 在该对象上创建缓存列表
  3. on 方法用来把函数 fn 都加到缓存列表中(订阅者注册事件到调度中心)
  4. emit 方法取到 arguments 里第一个当做 event,根据 event 值去执行对应缓存列表中的函数(发布者发布事件到调度中心,调度中心处理代码)
  5. off 方法可以根据 event 值取消订阅(取消订阅)
  6. once 方法只监听一次,调用完毕后删除缓存函数(订阅一次)
class ObjServer {
    static events = new Map();

    static on(name, fn) {
        console.log('已订阅', name)
        this.events.set(name, {isOnce: false, fn})
    }

    static once(name, fn) {
        this.events.set(name, {isOnce: true, fn})
    }

    static off(name) {
        this.events.delete(name)
    }

    static emit(name, ...data) {
        console.log('已发布', name)
        const func = this.events.get(name)
        func.fn(...data)
        if (func.isOnce) {
            this.events.delete(name)
        }
    }
}

const testFun1 = (user, age) => {
    console.log(user + ':' + age)
}

const testFun2 = (car, price) => {
    console.log(car + ':' + price)
}

ObjServer.on('user', testFun1)
ObjServer.on('car', testFun2)

ObjServer.emit('user', 'leitao', 25)
ObjServer.emit('user', 'tianyu', 24)

ObjServer.emit('car', 'aodi', 30)
ObjServer.emit('car', 'baoma', 40)

运行结果

已订阅 user 
已订阅 car 
已发布 user 
leitao:25 
已发布 user 
tianyu:24 
已发布 car 
aodi:30 
已发布 car 
baoma:40
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值