JS 观察者模式实现简单EventBus

  • 观察者模式(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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值