摘要:發(fā)布訂閱者模式實(shí)現(xiàn)了松耦合你可以讓發(fā)布者發(fā)布消息,訂閱者接受消息而不是尋找一種方式把兩個(gè)分離的系統(tǒng)連接在一起。這會(huì)導(dǎo)致惡意的消息被發(fā)布,訂閱者能夠獲得他們以前并不能獲得的消息。發(fā)布訂閱模式例子
介紹原文:Design Patterns:PubSub Explained
這個(gè)模式用來(lái)作為中間人,一個(gè)把發(fā)布者和訂閱者架接在一起的代理。發(fā)布者是當(dāng)完成某些過(guò)程的時(shí)候觸發(fā)事件的對(duì)象,訂閱者是希望當(dāng)發(fā)布者發(fā)布的時(shí)候希望被通知的對(duì)象。
生活中有一個(gè)很好地例子,廣播電臺(tái),人們會(huì)把頻道調(diào)到他們最喜歡的節(jié)目。廣播站不知道觀眾聽(tīng)得是什么或者他們正在聽(tīng)什么。他只需要發(fā)布他們的節(jié)目就可以啦。觀眾也不知道廣播站制作節(jié)目的過(guò)程。他們只要在他們最喜歡的節(jié)目運(yùn)行的時(shí)候把臺(tái)調(diào)到對(duì)應(yīng)的頻道或者告知朋友就行。
發(fā)布/訂閱者模式實(shí)現(xiàn)了松耦合:你可以讓發(fā)布者發(fā)布消息,訂閱者接受消息而不是尋找一種方式把兩個(gè)分離的系統(tǒng)連接在一起。
優(yōu)勢(shì)松耦合
發(fā)布者不需要知道訂閱者的數(shù)量,訂閱者聽(tīng)得話題或者訂閱者是通過(guò)什么方式運(yùn)行的。他們能夠相互獨(dú)立地運(yùn)行,這樣就可以讓你分開(kāi)開(kāi)發(fā)這兩部分而不需要擔(dān)心對(duì)狀態(tài)或?qū)崿F(xiàn)的任何細(xì)微的影響。
可擴(kuò)展性
發(fā)布/訂閱模式可以讓系統(tǒng)在無(wú)論什么時(shí)候無(wú)法負(fù)載的時(shí)候擴(kuò)展
更干凈地設(shè)計(jì)
充分地利用好發(fā)布/訂閱模式,你不得不深入地思考不同的組件是如何交互的。這通常會(huì)讓我們有更干凈地設(shè)計(jì)因?yàn)槲覀儗?duì)解耦和松耦合的強(qiáng)調(diào)。
靈活性
你不需要擔(dān)心不同的組件是如何組合在一起的。只要他們共同遵守一份協(xié)議
容易測(cè)試
你可以很好地找出發(fā)布者或訂閱者是否會(huì)得到錯(cuò)誤的信息
缺點(diǎn)發(fā)布/訂閱模式最大的有點(diǎn)是解耦,但同時(shí)也是最大的缺點(diǎn):
中間人也許不會(huì)通知系統(tǒng)消息傳送的狀態(tài)。所以我們無(wú)法知道消息傳送是成功的還是失敗的。緊耦合是需要保證這一點(diǎn)的。
發(fā)布者不知道訂閱者的狀態(tài),反之亦然,這樣的話,你根本不知道在另一端是否會(huì)沒(méi)有問(wèn)題?
隨著訂閱者和發(fā)布者數(shù)量的增加,不斷增加的消息傳送回導(dǎo)致架構(gòu)的不穩(wěn)定,容易在負(fù)載大的時(shí)候出問(wèn)題
攻擊者(惡意的發(fā)布者)能夠入侵系統(tǒng)并且撕開(kāi)它。這會(huì)導(dǎo)致惡意的消息被發(fā)布,訂閱者能夠獲得他們以前并不能獲得的消息。
更新發(fā)布者和訂閱者的關(guān)系會(huì)是一個(gè)很難的問(wèn)題,因?yàn)楫吘顾麄兏静徽J(rèn)識(shí)對(duì)方。
需要中間人/代理商,消息規(guī)范和相關(guān)的規(guī)則會(huì)給系統(tǒng)增加一些復(fù)雜度
結(jié)論現(xiàn)實(shí)沒(méi)有銀彈,但是這個(gè)模式是設(shè)計(jì)松耦合系統(tǒng)的很好地方式。這和RSS,Atom和PubSubHubbub的思想一樣。
發(fā)布/訂閱模式例子(Javascript)
var makePubSub=function(){ var callbacks={}, publish=function(){ //Turn arguments object into real array var args=Array.prototype.slice.call(arguments,0); //Extract the event name which is the first entry var ev=args.shift(); //Return if callbacks object doesn"t contain //any entry for event var list,i,l; if(!callbacks[ev]){ return this; } list=callbacks[ev]; //Invoke the callbacks,passing in the rest of parameters for(i=0,l=list.length;i
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86135.html
摘要:盡管特定環(huán)境下有各種各樣的設(shè)計(jì)模式,開(kāi)發(fā)者還是傾向于使用一些習(xí)慣性的模式。原型設(shè)計(jì)模式依賴于原型繼承原型模式主要用于為高性能環(huán)境創(chuàng)建對(duì)象。對(duì)于一個(gè)新創(chuàng)建的對(duì)象,它將保持構(gòu)造器初始化的狀態(tài)。這樣做主要是為了避免訂閱者和發(fā)布者之間的依賴。 2016-10-07 每個(gè)JS開(kāi)發(fā)者都力求寫(xiě)出可維護(hù)、復(fù)用性和可讀性高的代碼。隨著應(yīng)用不斷擴(kuò)大,代碼組織的合理性也越來(lái)越重要。設(shè)計(jì)模式為特定環(huán)境下的常見(jiàn)...
摘要:發(fā)布訂閱模式在之前的文章里,創(chuàng)建了。我們稱之為發(fā)布訂閱模式。其實(shí)我們是用到了默認(rèn)的,用空字符串來(lái)標(biāo)識(shí)。空字符串代表了沒(méi)有名字的被路由到了由指定名字的。和這種關(guān)系的建立我們稱之為從現(xiàn)在開(kāi)始這個(gè)就會(huì)將推向我們的隊(duì)列了。 發(fā)布訂閱模式 在之前的文章里,創(chuàng)建了work queue。work queue中,每一個(gè)task都會(huì)派發(fā)給一個(gè)worker。在本章中,我們會(huì)完成完全不一樣的事情 - 我們會(huì)...
摘要:許多流行的框架,像或者都會(huì)把雙向數(shù)據(jù)綁定作為其中的主要特性來(lái)宣傳。盡管有好多種方式去實(shí)現(xiàn)這幾點(diǎn),一種簡(jiǎn)單高效的方法是我們通過(guò)發(fā)布訂閱者模式來(lái)實(shí)現(xiàn)。方法很簡(jiǎn)單我們可以使用定制的屬性作為代碼中需要綁定的屬性。 原文:Easy Two-Way Data Binding in Javascript 雙向數(shù)據(jù)綁定指的是當(dāng)對(duì)象的屬性發(fā)生變化時(shí)能夠同時(shí)改變對(duì)應(yīng)的UI,反之亦然。換句話說(shuō),如果我們有一...
摘要:應(yīng)用需要正確并合適響應(yīng)各種網(wǎng)絡(luò)請(qǐng)求用戶操作計(jì)時(shí)事件和各種延時(shí)動(dòng)作。好了,我們的新流程圖畫(huà)出來(lái)了提示城市名稱查找不是很復(fù)雜,谷歌地圖為此提供了非常簡(jiǎn)單的。形象點(diǎn)表示就是,函數(shù)是一等公民。 By Hubert Zub | Oct 3, 2018 原文 當(dāng)你將關(guān)注點(diǎn)從樣式,美學(xué)和網(wǎng)格系統(tǒng)轉(zhuǎn)移到邏輯,框架和編寫(xiě)JavaScript代碼時(shí)。一切都開(kāi)始了,你會(huì)發(fā)現(xiàn)你處于你的web開(kāi)發(fā)歷程中最激動(dòng)人...
閱讀 2244·2021-11-19 09:55
閱讀 2729·2021-11-11 16:55
閱讀 3256·2021-09-28 09:36
閱讀 2038·2021-09-22 16:05
閱讀 3391·2019-08-30 15:53
閱讀 1856·2019-08-30 15:44
閱讀 2975·2019-08-29 13:10
閱讀 1410·2019-08-29 12:30