欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中發(fā)布/訂閱模式的簡單實例

 更新時間:2014年11月05日 12:01:17   投稿:junjie  
這篇文章主要介紹了JavaScript中發(fā)布/訂閱模式的簡單實例,本文給出了一個簡單易懂的實現(xiàn)代碼,比較容易理解,需要的朋友可以參考下

上次研究觀察者模式,很多文章說它也叫Subscribe/Publish(發(fā)布/訂閱模式)??稍凇禞avascript設(shè)計模式》一書中,這兩種模式還是有些區(qū)別的。書中原話如下:

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

2.Subscribe/Publish模式使用了一個主題/事件通道,這個通道介于訂閱者和發(fā)布者之間。該事件系統(tǒng)允許代碼定義應(yīng)用程序的特定事件,該事件可以傳遞自定義參數(shù),自定義參數(shù)包含訂閱者所需要的值。其目的是避免訂閱者和發(fā)布者產(chǎn)生依賴關(guān)系。

與Observer模式不同之處在于它允許任何訂閱者執(zhí)行適當(dāng)?shù)氖录幚沓绦騺碜院徒邮瞻l(fā)布者發(fā)出的通知。

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

1.觀察者模式中,目標(biāo)對象負(fù)責(zé)維護(hù)觀察者。發(fā)布/訂閱模式中發(fā)布者不關(guān)心訂閱者,只負(fù)責(zé)把消息丟出去就不管了。

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

下面是js中發(fā)布/訂閱模式的實現(xiàn),復(fù)制粘貼到console里面試一試就明白了:

復(fù)制代碼 代碼如下:

var pubsub = (function(){
    var q = {}
        topics = {},
        subUid = -1;
    //發(fā)布消息
    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,刪除指定元素
})();
//觸發(fā)的事件
var logmsg = function(topics, data) {
    console.log("logging:" + topics + ":" + data);
}
//監(jiān)聽指定的消息'msgName'
var sub = pubsub.subscribe('msgName', logmsg);
//發(fā)布消息'msgName'
pubsub.publish('msgName', 'hello world');
//發(fā)布無人監(jiān)聽的消息'msgName1'
pubsub.publish('anotherMsgName', 'me too!');

相關(guān)文章

  • Javascript中實現(xiàn)trim()函數(shù)的兩種方法

    Javascript中實現(xiàn)trim()函數(shù)的兩種方法

    這篇文章主要介紹了Javascript中實現(xiàn)trim()函數(shù)的兩種方法,本文直接給出實現(xiàn)代碼和使用方法,需要的朋友可以參考下
    2015-02-02
  • js 通用訂單代碼

    js 通用訂單代碼

    對于訂單,想必大家并不陌生吧,下為大家介紹下使用js實現(xiàn)的訂單,感興趣的朋友可以參考下
    2013-12-12
  • 自己寫了一個展開和收起的多更能型的js效果

    自己寫了一個展開和收起的多更能型的js效果

    展開和收起這樣的效果想必大家早就眼熟了吧,利用閑暇時間用js寫了一個具體功能:當(dāng)自己處于全部顯示的時候,點擊自己的收起,自己收起等等感興趣的你可以參考下哈
    2013-03-03
  • javascript ES6 Template String模板字符串使用方法

    javascript ES6 Template String模板字符串使用方法

    這篇文章主要介紹了javascript ES6 模板字符串(Template String)是增強(qiáng)版的字符串,用反引號(`)標(biāo)識,它可以當(dāng)作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量,需要的朋友可以參考下
    2023-06-06
  • js parseInt("08")未指定進(jìn)位制問題

    js parseInt("08")未指定進(jìn)位制問題

    今天在做JS關(guān)于月份的判斷,對于parseInt("01")到parseInt("07");都能得到正確的結(jié)果,但如果是parseInt("08")或parseInt("09")則返回0,首先看parseInt語法:parseInt(string, radix);
    2010-06-06
  • JavaScript代碼簡化技巧實例解析

    JavaScript代碼簡化技巧實例解析

    這篇文章主要介紹了JavaScript代碼簡化技巧實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • js的各種數(shù)據(jù)類型判斷的介紹

    js的各種數(shù)據(jù)類型判斷的介紹

    今天小編就為大家分享一篇關(guān)于js的各種數(shù)據(jù)類型判斷的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • JavaScript中的property和attribute介紹

    JavaScript中的property和attribute介紹

    JavaScript中的property和attribute介紹,需要的朋友可以參考下。
    2011-12-12
  • 解決layer彈出層自適應(yīng)頁面大小的問題

    解決layer彈出層自適應(yīng)頁面大小的問題

    今天小編就為大家分享一篇解決layer彈出層自適應(yīng)頁面大小的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • js判斷為空Null與字符串為空簡寫方法

    js判斷為空Null與字符串為空簡寫方法

    最近開始研究JavaScript的簡寫方法,下面就是有關(guān)判斷為空的簡寫方法
    2014-02-02

最新評論