一、观察者模式
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;
})