成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] 設(shè)計模式:發(fā)布/訂閱模式解析

niuxiaowei111 / 2439人閱讀

摘要:發(fā)布訂閱者模式實(shí)現(xiàn)了松耦合你可以讓發(fā)布者發(fā)布消息,訂閱者接受消息而不是尋找一種方式把兩個分離的系統(tǒng)連接在一起。這會導(dǎo)致惡意的消息被發(fā)布,訂閱者能夠獲得他們以前并不能獲得的消息。發(fā)布訂閱模式例子

原文:Design Patterns:PubSub Explained

介紹

這個模式用來作為中間人,一個把發(fā)布者和訂閱者架接在一起的代理。發(fā)布者是當(dāng)完成某些過程的時候觸發(fā)事件的對象,訂閱者是希望當(dāng)發(fā)布者發(fā)布的時候希望被通知的對象。

生活中有一個很好地例子,廣播電臺,人們會把頻道調(diào)到他們最喜歡的節(jié)目。廣播站不知道觀眾聽得是什么或者他們正在聽什么。他只需要發(fā)布他們的節(jié)目就可以啦。觀眾也不知道廣播站制作節(jié)目的過程。他們只要在他們最喜歡的節(jié)目運(yùn)行的時候把臺調(diào)到對應(yīng)的頻道或者告知朋友就行。

發(fā)布/訂閱者模式實(shí)現(xiàn)了松耦合:你可以讓發(fā)布者發(fā)布消息,訂閱者接受消息而不是尋找一種方式把兩個分離的系統(tǒng)連接在一起。

優(yōu)勢

松耦合

發(fā)布者不需要知道訂閱者的數(shù)量,訂閱者聽得話題或者訂閱者是通過什么方式運(yùn)行的。他們能夠相互獨(dú)立地運(yùn)行,這樣就可以讓你分開開發(fā)這兩部分而不需要擔(dān)心對狀態(tài)或?qū)崿F(xiàn)的任何細(xì)微的影響。

可擴(kuò)展性

發(fā)布/訂閱模式可以讓系統(tǒng)在無論什么時候無法負(fù)載的時候擴(kuò)展

更干凈地設(shè)計

充分地利用好發(fā)布/訂閱模式,你不得不深入地思考不同的組件是如何交互的。這通常會讓我們有更干凈地設(shè)計因?yàn)槲覀儗怦詈退神詈系膹?qiáng)調(diào)。

靈活性

你不需要擔(dān)心不同的組件是如何組合在一起的。只要他們共同遵守一份協(xié)議

容易測試

你可以很好地找出發(fā)布者或訂閱者是否會得到錯誤的信息

缺點(diǎn)

發(fā)布/訂閱模式最大的有點(diǎn)是解耦,但同時也是最大的缺點(diǎn):

中間人也許不會通知系統(tǒng)消息傳送的狀態(tài)。所以我們無法知道消息傳送是成功的還是失敗的。緊耦合是需要保證這一點(diǎn)的。

發(fā)布者不知道訂閱者的狀態(tài),反之亦然,這樣的話,你根本不知道在另一端是否會沒有問題?

隨著訂閱者和發(fā)布者數(shù)量的增加,不斷增加的消息傳送回導(dǎo)致架構(gòu)的不穩(wěn)定,容易在負(fù)載大的時候出問題

攻擊者(惡意的發(fā)布者)能夠入侵系統(tǒng)并且撕開它。這會導(dǎo)致惡意的消息被發(fā)布,訂閱者能夠獲得他們以前并不能獲得的消息。

更新發(fā)布者和訂閱者的關(guān)系會是一個很難的問題,因?yàn)楫吘顾麄兏静徽J(rèn)識對方。

需要中間人/代理商,消息規(guī)范和相關(guān)的規(guī)則會給系統(tǒng)增加一些復(fù)雜度

結(jié)論

現(xiàn)實(shí)沒有銀彈,但是這個模式是設(shè)計松耦合系統(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86135.html

相關(guān)文章

  • [] 你應(yīng)了解的4種JS設(shè)計模式

    摘要:盡管特定環(huán)境下有各種各樣的設(shè)計模式,開發(fā)者還是傾向于使用一些習(xí)慣性的模式。原型設(shè)計模式依賴于原型繼承原型模式主要用于為高性能環(huán)境創(chuàng)建對象。對于一個新創(chuàng)建的對象,它將保持構(gòu)造器初始化的狀態(tài)。這樣做主要是為了避免訂閱者和發(fā)布者之間的依賴。 2016-10-07 每個JS開發(fā)者都力求寫出可維護(hù)、復(fù)用性和可讀性高的代碼。隨著應(yīng)用不斷擴(kuò)大,代碼組織的合理性也越來越重要。設(shè)計模式為特定環(huán)境下的常見...

    awokezhou 評論0 收藏0
  • 】RabbitMQ系列(三) - 發(fā)布/訂閱模式

    摘要:發(fā)布訂閱模式在之前的文章里,創(chuàng)建了。我們稱之為發(fā)布訂閱模式。其實(shí)我們是用到了默認(rèn)的,用空字符串來標(biāo)識??兆址砹藳]有名字的被路由到了由指定名字的。和這種關(guān)系的建立我們稱之為從現(xiàn)在開始這個就會將推向我們的隊(duì)列了。 發(fā)布訂閱模式 在之前的文章里,創(chuàng)建了work queue。work queue中,每一個task都會派發(fā)給一個worker。在本章中,我們會完成完全不一樣的事情 - 我們會...

    WrBug 評論0 收藏0
  • []簡單的用javascript實(shí)現(xiàn)的數(shù)據(jù)雙向綁定

    摘要:許多流行的框架,像或者都會把雙向數(shù)據(jù)綁定作為其中的主要特性來宣傳。盡管有好多種方式去實(shí)現(xiàn)這幾點(diǎn),一種簡單高效的方法是我們通過發(fā)布訂閱者模式來實(shí)現(xiàn)。方法很簡單我們可以使用定制的屬性作為代碼中需要綁定的屬性。 原文:Easy Two-Way Data Binding in Javascript 雙向數(shù)據(jù)綁定指的是當(dāng)對象的屬性發(fā)生變化時能夠同時改變對應(yīng)的UI,反之亦然。換句話說,如果我們有一...

    pf_miles 評論0 收藏0
  • []為什么前端初學(xué)者必須要明白發(fā)布訂閱模式

    摘要:應(yīng)用需要正確并合適響應(yīng)各種網(wǎng)絡(luò)請求用戶操作計時事件和各種延時動作。好了,我們的新流程圖畫出來了提示城市名稱查找不是很復(fù)雜,谷歌地圖為此提供了非常簡單的。形象點(diǎn)表示就是,函數(shù)是一等公民。 By Hubert Zub | Oct 3, 2018 原文 當(dāng)你將關(guān)注點(diǎn)從樣式,美學(xué)和網(wǎng)格系統(tǒng)轉(zhuǎn)移到邏輯,框架和編寫JavaScript代碼時。一切都開始了,你會發(fā)現(xiàn)你處于你的web開發(fā)歷程中最激動人...

    miqt 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<