发布订阅模式和观察者模式

205 阅读1分钟

1、发布订阅模式

订阅一件事,当事件发生的时候,触发对应的函数

订阅on,发布emit,promise的内部也是基于发布订阅模式的

let e = {
    _obj: {},   
    _callbacks: [],    
    on(callback){
        this._callbacks.push(callback);    //将订阅的函数一次放入数组中
    },
    emit(key, value){
        this._obj[key] = value
        this._callbacks.forEach( m => {    //依次执行订阅的函数
            m(this._obj)
        } )
    }
}
e.on(function(obj){    //每次发布都会触发这个函数
       console.log(obj) 
})
fs.readFile("./jiagouke/1.callback/name.txt", "utf8", function (error, data) {    e.emit('age', data)})fs.readFile("./jiagouke/1.callback/age.txt", "utf8", function (error, data) {    e.emit('name', data)})

2、观察者模式

观察者模式基于发布订阅模式

区别:

1)发布订阅:发布和订阅无关

2)观察者模式: 观察者和被观察者是相关的;被观察者存放着观察者,被观察者状态变化,更新自己身上的所有观察者

class Subject{
    constructor(){
        this.state = 'happy';
        this.arr = [];         //用来存放观察者
    }
    attach(member){    // 装载观察者的
        this.arr.push(member)
    }
    updateState(newState){    // 更新自己的状态
        this.state = newState;
        this.arr.forEach( observer => observer.update(newState))
    }
}
class Observer{
    constructor(who){
        this.who = who;
    }
    // 这个方法是用来被 被观察者调用的
    update(newState){
        console.log(this.who+newState+'了')
    }
}
let subject = new Subject();
let my1 = new Observer('mom');
let my2 = new Observer('daddy');subject.attach(my1);
subject.attach(my2);subject.updateState('carry');