-
观察者模式(Observer Pattern)
观察者模式又称发布订阅模式(Publish/Subscribe Pattern)。被观察对象(subject)维护一组观察者(observer),当被观察对象状态改变时,通过调用观察者的某个方法将这些变化通知到观察者。
三要素:
subscribe(): 接收一个观察者observer对象,使其订阅自己
unsubscribe(): 接收一个观察者observer对象,使其取消订阅自己
fire(): 触发事件,通知到所有观察者 -
EventBus核心
on: 观察者订阅某一事件
off: 观察者取消订阅某一事件
emit: 触发某一事件,通知订阅该事件的所有观察者
/**
* a simple EventBus use Observer Pattern
*/
class EventBus {
constructor(){
this._event = new Map()
}
// listen obsever
on(event, obsever){
let curEvent = this._event.get(event)
if (!curEvent){
this._event.set(event, [obsever])
} else {
curEvent.push(obsever)
}
}
// remove listener
off(event, obsever){
let curEvent = this._event.get(event)
let index = curEvent.indexOf(obsever)
curEvent.splice(index, 1)
}
// emit obsever
emit(event, ...arg){
let curEvent = this._event.get(event)
for (let obsever of curEvent) {
obsever.call(this, arg)
}
}
}
const fn1 = function(...parame){
console.log(`I am fn1 ${parame}`);
}
const fn2 = function(...parame){
console.log(`I am fn2 ${parame}`);
}
const fn3 = function(...parame){
console.log(`I am fn3 ${parame}`);
}
const fn4 = function(...parame){
console.log(`I am fn4 ${parame}`);
}
const eventBus = new EventBus()
// test ---------------------------------------- test
eventBus.on('event1',fn1)
eventBus.on('event1',fn2)
eventBus.on('event1',fn3)
eventBus.on('event2',fn4)
eventBus.emit('event1','first emit')
console.log("--------------");
eventBus.emit('event2', 'first emit')
console.log("--------------'\n--------------");
eventBus.off('event1',fn2)
eventBus.on('event2',fn2)
eventBus.emit('event1','second emit')
console.log("--------------");
eventBus.emit('event2','second emit')