js发布订阅者模式es6实现及其图解

本文通过代码示例和图解详细阐述了如何使用ES6来实现JavaScript的发布订阅者模式,同时鼓励读者在遇到疑问时留言讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码



//主题
class Dep{
  constructor(callback){
    this.subs=[];
    //每个主题更新数据的方法不一样,所以需要传进来
    this.callback=callback;
  }
  addSub(sub){
    this.subs.push(sub);
    return this;
  }
  notify(){
    //通知此主题所有订阅者更新数据
    this.subs.forEach(item=>item.update(this.callback))
  }
}
//订阅者(Watcher)
class Sub{
  constructor(val) {
    this.val=val
  }
  update(callback){
    this.val=callback(this.val);
    //相当于更新视图操作
    console.log(this.val);
  }
}
//发布者
class Pub{
  constructor(){
    this.deps=[];
  }
  addDep(dep){
    this.deps.push(dep)
  }
  removeDep(dep){
    let index=this.deps.indexOf(dep);
    if(index!==-1){
      this.deps.splice(index,1);
      return true
    }else{
      return false
    }
  }
  publish(dep){
  	//发布某个主题的更新
    this.deps.forEach(item=>item == dep && item.notify());
  }
}

//新建主题, 并向主题中增加订阅者
let dep1=new Dep(item=>item*item);
dep1.addSub(new Sub(1)).addSub(new Sub(2)).addSub(new Sub(3));
//新建发布者, 并向发布者中增加主题
let pub=new Pub();
pub.addDep(dep1);
//发布者发布, 通知所有主题的所有订阅者更新
pub.publish(dep1);
//发布者发布, 通知所有主题的所有订阅者更新
pub.publish(dep1);
console.log("===========================");
//新建主题, 并向主题中增加订阅者
let dep2=new Dep(item=>item+item);
dep2.addSub(new Sub(1)).addSub(new Sub(2)).addSub(new Sub(3));
//向发布者中增加主题
pub.addDep(dep2);
//发布者发布, 通知所有主题的所有订阅者更新
pub.publish(dep2);
//发布者发布, 通知所有主题的所有订阅者更新
pub.publish(dep2);

//结果
1
4
9
1
16
81
===========================
2
4
6
4
8
12

直接上图解
在这里插入图片描述

有什么不懂得,直接留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值