JavaScript中發佈/訂閱模式的簡單實例

1.Observer模式要求希望接收到主題通知者的觀察者必須訂閱內容改變的事件。

2.Subscribe/Publish模式使用了一個主題/事件通道,這個通道介於訂閱者和發佈者之間。該事件系統允許代碼定義應用程序的特定事件,該事件可以傳遞自定義參數,自定義參數包含訂閱者所需要的值。其目的是避免訂閱者和發佈者產生依賴關係。

與Observer模式不同之處在於它允許任何訂閱者執行適當的事件處理程序來註冊和接收發布者發出的通知。

好吧,不明覺厲。下面是我的理解:

1.觀察者模式中,目標對象負責維護觀察者。發佈/訂閱模式中發佈者不關心訂閱者,只負責把消息丟出去就不管了。

2.觀察者模式中,觀察者要提供一個接口,然後當目標對象發生改變時調用此接口使自身狀態和目標狀態保持一致。即所有的觀察者都要有一個統一的接口(比如上文中寫的update方法,大家的方法都要叫這個名字)。而發佈/訂閱模式中,訂閱者事件的觸發不是依靠這樣一個接口,而是訂閱者通過監聽一個特定的消息(這個消息一般包含名稱和訂閱者所需要的參數)來觸發的。可以理解爲訂閱者監聽的不是發佈者,而是消息池,只要消息池裏有它關心的消息,即觸發事件,不管這個消息是誰發佈過去的。發佈者和訂閱者是解耦的。

下面是js中發佈/訂閱模式的實現,複製粘貼到console裏面試一試就明白了:

 

 
var pubsub = (function(){
    var q = {}
        topics = {},
        subUid = -1;
    //發佈消息
    q.publish = function(topic, args) {
        if(!topics[topic]) {return;}
        var subs = topics[topic],
            len = subs.length;
        while(len--) {
            subs[len].func(topic, args);
        }
        return this;
    };
    //訂閱事件
    q.subscribe = function(topic, func) {
        topics[topic] = topics[topic] ? topics[topic] : [];
        var token = (++subUid).toString();
        topics[topic].push({
            token : token,
            func : func
        });
        return token;
    };
    return q;
    //取消訂閱就不寫了,遍歷topics,然後通過保存前面返回token,刪除指定元素
})();
//觸發的事件
var logmsg = function(topics, data) {
    console.log("logging:" + topics + ":" + data);
}
//監聽指定的消息'msgName'
var sub = pubsub.subscribe('msgName', logmsg);
//發佈消息'msgName'
pubsub.publish('msgName', 'hello world');
//發佈無人監聽的消息'msgName1'
pubsub.publish('anotherMsgName', 'me too!');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章