国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:10:25
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript中發布/訂閱模式的簡單實例,本文給出了一個簡單易懂的實現代碼,比較容易理解,需要的朋友可以參考下
 
 

上次研究觀察者模式,很多文章說它也叫Subscribe/Publish(發布/訂閱模式)。可在《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!');

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 浦县| 义马市| 屏山县| 阜康市| 吴忠市| 远安县| 镇康县| 海安县| 麦盖提县| 潍坊市| 高台县| 永泰县| 丽江市| 崇礼县| 临颍县| 浮梁县| 固始县| 辉县市| 普格县| 合水县| 永善县| 宜兴市| 巴里| 郓城县| 德清县| 东丽区| 饶平县| 舞阳县| 拉孜县| 英山县| 铜鼓县| 财经| 海盐县| 兖州市| 永昌县| 呼伦贝尔市| 邵东县| 鄄城县| 太保市| 陆河县| 开原市|