设计模式系列之发布订阅模式

190 阅读1分钟

发布订阅模式

参考:zhuanlan.zhihu.com/p/60324936

// 发布订阅
class PubSub {
    constructor() {
        this.subscribers = {}
    }
    // 订阅监听
    subscribe(type, fn) {
        let listeners = this.subscribers[type] || [];
        if(listeners.length == 0){
            this.subscribers[type] = listeners
        }
        listeners.push(fn);
    }
    // 解绑
    unsubscribe(type, fn) {
        let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        this.subscribers[type] = listeners.filter(v => v !== fn);
    }
    
    // 发布
    publish(type, ...args) {
        let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        listeners.forEach(fn => fn(...args));        
    }
}

let ob = new PubSub();
ob.subscribe('add', (val) => console.log(val));
ob.publish('add', 1);