JavaScript中發(fā)布/訂閱模式的簡(jiǎn)單實(shí)例
上次研究觀察者模式,很多文章說(shuō)它也叫Subscribe/Publish(發(fā)布/訂閱模式)??稍凇禞avascript設(shè)計(jì)模式》一書(shū)中,這兩種模式還是有些區(qū)別的。書(shū)中原話如下:
1.Observer模式要求希望接收到主題通知者的觀察者必須訂閱內(nèi)容改變的事件。
2.Subscribe/Publish模式使用了一個(gè)主題/事件通道,這個(gè)通道介于訂閱者和發(fā)布者之間。該事件系統(tǒng)允許代碼定義應(yīng)用程序的特定事件,該事件可以傳遞自定義參數(shù),自定義參數(shù)包含訂閱者所需要的值。其目的是避免訂閱者和發(fā)布者產(chǎn)生依賴(lài)關(guān)系。
與Observer模式不同之處在于它允許任何訂閱者執(zhí)行適當(dāng)?shù)氖录幚沓绦騺?lái)注冊(cè)和接收發(fā)布者發(fā)出的通知。
好吧,不明覺(jué)厲。下面是我的理解:
1.觀察者模式中,目標(biāo)對(duì)象負(fù)責(zé)維護(hù)觀察者。發(fā)布/訂閱模式中發(fā)布者不關(guān)心訂閱者,只負(fù)責(zé)把消息丟出去就不管了。
2.觀察者模式中,觀察者要提供一個(gè)接口,然后當(dāng)目標(biāo)對(duì)象發(fā)生改變時(shí)調(diào)用此接口使自身狀態(tài)和目標(biāo)狀態(tài)保持一致。即所有的觀察者都要有一個(gè)統(tǒng)一的接口(比如上文中寫(xiě)的update方法,大家的方法都要叫這個(gè)名字)。而發(fā)布/訂閱模式中,訂閱者事件的觸發(fā)不是依靠這樣一個(gè)接口,而是訂閱者通過(guò)監(jiān)聽(tīng)一個(gè)特定的消息(這個(gè)消息一般包含名稱(chēng)和訂閱者所需要的參數(shù))來(lái)觸發(fā)的??梢岳斫鉃橛嗛喺弑O(jiān)聽(tīng)的不是發(fā)布者,而是消息池,只要消息池里有它關(guān)心的消息,即觸發(fā)事件,不管這個(gè)消息是誰(shuí)發(fā)布過(guò)去的。發(fā)布者和訂閱者是解耦的。
下面是js中發(fā)布/訂閱模式的實(shí)現(xiàn),復(fù)制粘貼到console里面試一試就明白了:
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;
//取消訂閱就不寫(xiě)了,遍歷topics,然后通過(guò)保存前面返回token,刪除指定元素
})();
//觸發(fā)的事件
var logmsg = function(topics, data) {
console.log("logging:" + topics + ":" + data);
}
//監(jiān)聽(tīng)指定的消息'msgName'
var sub = pubsub.subscribe('msgName', logmsg);
//發(fā)布消息'msgName'
pubsub.publish('msgName', 'hello world');
//發(fā)布無(wú)人監(jiān)聽(tīng)的消息'msgName1'
pubsub.publish('anotherMsgName', 'me too!');
- JavaScript事件發(fā)布/訂閱模式原理與用法分析
- JavaScript實(shí)現(xiàn)與使用發(fā)布/訂閱模式詳解
- JS前端設(shè)計(jì)模式之發(fā)布訂閱模式詳解
- js 發(fā)布訂閱模式的實(shí)例講解
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- 詳解JavaScript設(shè)計(jì)模式中的享元模式
- JavaScript設(shè)計(jì)模式之單例模式應(yīng)用場(chǎng)景案例詳解
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
- javascript 發(fā)布-訂閱模式 實(shí)例詳解
相關(guān)文章
Javascript中實(shí)現(xiàn)trim()函數(shù)的兩種方法
這篇文章主要介紹了Javascript中實(shí)現(xiàn)trim()函數(shù)的兩種方法,本文直接給出實(shí)現(xiàn)代碼和使用方法,需要的朋友可以參考下2015-02-02
自己寫(xiě)了一個(gè)展開(kāi)和收起的多更能型的js效果
展開(kāi)和收起這樣的效果想必大家早就眼熟了吧,利用閑暇時(shí)間用js寫(xiě)了一個(gè)具體功能:當(dāng)自己處于全部顯示的時(shí)候,點(diǎn)擊自己的收起,自己收起等等感興趣的你可以參考下哈2013-03-03
javascript ES6 Template String模板字符串使用方法
這篇文章主要介紹了javascript ES6 模板字符串(Template String)是增強(qiáng)版的字符串,用反引號(hào)(`)標(biāo)識(shí),它可以當(dāng)作普通字符串使用,也可以用來(lái)定義多行字符串,或者在字符串中嵌入變量,需要的朋友可以參考下2023-06-06
js parseInt("08")未指定進(jìn)位制問(wèn)題
今天在做JS關(guān)于月份的判斷,對(duì)于parseInt("01")到parseInt("07");都能得到正確的結(jié)果,但如果是parseInt("08")或parseInt("09")則返回0,首先看parseInt語(yǔ)法:parseInt(string, radix);2010-06-06
JavaScript代碼簡(jiǎn)化技巧實(shí)例解析
這篇文章主要介紹了JavaScript代碼簡(jiǎn)化技巧實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
JavaScript中的property和attribute介紹
JavaScript中的property和attribute介紹,需要的朋友可以參考下。2011-12-12
解決layer彈出層自適應(yīng)頁(yè)面大小的問(wèn)題
今天小編就為大家分享一篇解決layer彈出層自適應(yīng)頁(yè)面大小的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
js判斷為空Null與字符串為空簡(jiǎn)寫(xiě)方法
最近開(kāi)始研究JavaScript的簡(jiǎn)寫(xiě)方法,下面就是有關(guān)判斷為空的簡(jiǎn)寫(xiě)方法2014-02-02

