2

发布订阅模式

发布订阅模式直接没有关联,可以不发布只订阅 也可以只订阅不发布
例:

const event = {
    _arr: [],
    on(fn) {
        this._arr.push(fn)
    },
    emit() {
        this._arr.forEach(fn => {
            fn()
        })    
    }
}

event.on(() => {
    console.log('数据来了')
})
const obj = {}
event.on(() => {
   if(Object.keys(obj).length == 2) {
       console.log(obj)
   }
})

obj.name = 'test'
event.emit() 
obj.age = 12
event.emit()

观察者模式

(基于发布订阅的 ,而且观察者模式发布订阅之间是有关联的)

class Subject {
    constructor () {
        this.state = '开心'
        this.observers = []
    }
    attach (o) {
        this.observers.push(o)
    }
    setState (newState) {
        this.state = newState
        this.observers.forEach(o => {
            o.update(this)
        })
    }
}

class Observer {
    update (sub) {
       console.log('被观察着的状态是:' + sub.state)
    }
}

const mama = new Observer()
const baba = new Observer()
const baby = new Subject()
baby.attach(mama)
baby.attach(baba)
baby.setState('不开心')

小葱
95 声望3 粉丝