發(fā)布訂閱模式(觀察者模式)

發(fā)布訂閱模式(觀察者模式)

發(fā)布訂閱也叫觀察者模式

發(fā)布 && 訂閱

// 觀察者模式(發(fā)布訂閱)
// 發(fā)布者
class Publisher {
    /**
     * 構(gòu)造函數(shù):
     * 定義一個(gè)存放所有觀察者的數(shù)組
     */
    constructor() {
        this.subs = [];
    }

    /**
     * 判斷是否是 Subscriber 類的實(shí)例
     * @param {*} subscriber 
     */
    isSubscriber(subscriber) {
        return subscriber instanceof Subscriber;
    }
    
    /**
     * 添加訂閱者
     * @param {*} Subscriber 
     */
    addSubscriber(Subscriber) {
        if (!this.isSubscriber(Subscriber)) {
            throw new Error("The parameter is must be instanceof Subscriber");
        }
        this.subs.push(Subscriber);
    }

    /**
     * 移除訂閱者
     * @param {*} Subscriber 
     */
    removeSubscriber(Subscriber) {
        if (!this.isSubscriber(Subscriber)) {
            throw new Error("The parameter is must be instanceof Subscriber");
        }
        this.subs.forEach((item, index) => {
            if (item === Subscriber) {
                this.subs[index] = null;
            }
        });
    }

    /**
     * 通知所有訂閱者執(zhí)行
     * @param  {...any} args 
     */
    notify(...args) {
        this.subs.forEach(item => {
            if (this.isSubscriber(item)) {
                item.exec(...args)
            }
        });
    }
}

// 訂閱者
class Subscriber {
    /**
     * 構(gòu)造函數(shù):
     * 在初始化實(shí)例的時(shí)候必須傳入一個(gè)函數(shù)
     * 將這個(gè)函數(shù)fn掛載到實(shí)例上
     * @param {*} fn 
     */
    constructor(fn) {
        if (typeof fn !== "function") {
            throw new Error("The parameter is must be function");
        }
        this.fn = fn;
    }

    /**
     * 確保每個(gè)實(shí)例都有一個(gè)exec方法
     * 在發(fā)布者通知執(zhí)行的時(shí)候執(zhí)行實(shí)例上的fn方法
     */
    exec() {
        this.fn();
    }
}

使用

const publisher = new Publisher();
const w1 = new Subscriber(function () {
    console.log(1);
});
const w2 = new Subscriber(function () {
    publisher.removeSubscriber(w1);
    console.log(2);
});
const w3 = new Subscriber(function () {
    console.log(3);
});

publisher.addSubscriber(w1);
publisher.addSubscriber(w2);
publisher.addSubscriber(w3);

publisher.notify(); // 1 2 3
console.log("------------");
publisher.notify(); // 2 3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容