观察者模式observer和发布订阅on-emit

一、观察者模式 

   1、发布订阅  是发布和订阅之间没有任何联系

   2、观察者模式  (内部基于发布订阅的)  有一个观察者,被观察者

  3、观察者模式包含发布订阅的。关联就是依赖收集

// 发布订阅  是发布和订阅之间没有任何联系
// 观察者模式  (内部基于发布订阅的)  有一个观察者,被观察者

class  Subject{  //被观察者
    constructor(name){
        this.name=name;
        this.arr=[];
        this.state='我恨开心';
    }
    attach(observer){   //注册观察者  基于发布订阅
        this.arr.push(observer)
    }
    setState(newState){
        this.state=newState;
        this.arr.forEach(o=>o.update(this));  //通知所有观察者 我的状态发生了变化
    }
}
class Observer{ //观察者
    constructor(name){
        this.name=name;
    }
    update(s){
        console.log(s.name+'当前状态是'+s.state+'对:'+this.name);
    }
}
let s=new Subject('小宝宝');
let o1=new Observer('我');
let o2=new Observer('我媳妇');
s.attach(o1);  //关联操作
s.attach(o2);  //关联操作
s.setState(s.state)

// 注册关系 需要让我们观察和被观察者产生关系
console.log(s.name);

//观察者模式包含发布订阅的。
//关联就是依赖收集

二、发布订阅

   1、订阅 就是将要做的事情先存储好,稍后发布的时候让订阅好的事情依次执行

   2、 观察者模式和发布订阅有什么关系?

   3、发布订阅 他们之间没有任何联系

const fs=require('fs');
//订阅 就是将要做的事情先存储好,稍后发布的时候让订阅好的事情依次执行
// 观察者模式和发布订阅有什么关系?
let events={
    arr:[],  //发布订阅 他们之间没有任何联系
    on(fn){
        this.arr.push(fn);
    },
    emit(){
        this.arr.forEach(fn=>fn())
    }
}
events.on(()=>{
    console.log('读取到了数据');
})
let renderObj={}
events.on(()=>{
    if(Object.keys(renderObj).length==2){
        console.log('读取完毕了');
    }
})
fs.readFile('name.txt','utf8',function(err,data){
    renderObj['name']=data;
})
fs.readFile('age.txt','utf8',function(err,data){
    renderObj['age']=data;
})

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vues

刚好遇见你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值