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

資訊專欄INFORMATION COLUMN

發(fā)布訂閱模式實現(xiàn)及發(fā)布訂閱者模式與觀察者模式的不同

Jensen / 2907人閱讀

摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個事件觸發(fā),只知道事件觸發(fā)時候,會告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。

概念

發(fā)布訂閱者模式,是javascript甚至大多數(shù)語言都有的語言模式,比較概念的解釋是,

訂閱者把自己想訂閱的事件注冊到調(diào)度中心,當(dāng)該事件觸發(fā)時候,發(fā)布者發(fā)布該事件到調(diào)度中心(第三方),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊到調(diào)度中心的處理代碼。
優(yōu)缺點

優(yōu)點
1.一對多。
一個發(fā)布者可以綁定多個訂閱者,當(dāng)事件觸發(fā)時,由調(diào)度中心全部通知。
2.解耦。
發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個事件觸發(fā),只知道事件觸發(fā)時候,會告訴自己。發(fā)布者也不用一一通知,只要告訴調(diào)度中心,事件觸發(fā)了就好了。所以代碼松耦合。
3.程序便于擴展。
缺點:
實現(xiàn)方式麻煩?

舉例

用平時身邊的例子解釋,比如你被阿里邀請面試,面試完你問面試官什么時候出結(jié)果,面試官告訴你結(jié)果出來時候會通知你的,這樣你就不用天天打電話問面試結(jié)果了,等面試結(jié)果出來,面試官會把面試結(jié)果統(tǒng)一發(fā)郵件給面試者,當(dāng)你收到面試結(jié)果后,進行下一步操作,是到阿里上班,還是面試下一家。

代碼實現(xiàn)
var observer = function () {
    var _observer = {};     
    let _queue = {};     // 所有事件的隊列
    /**
    * @param 注冊的事件名稱
    * @param 事件觸發(fā)時執(zhí)行的函數(shù)
    */
    _observer.on = function (eventName, fn) {
        if (Object.prototype.toString.call(fn) !== "[object Function]") return;
        if (_queue[eventName] && _queue[eventName].length > 0) {
            // 如果之前注冊過eventName事件
            _queue[eventName].push(fn);
        } else {
            // 之前沒有注冊過eventName事件
            _queue[eventName] = [fn];
        }
    },
     /**
    * @param 已經(jīng)觸發(fā)的事件(發(fā)布事件)
    */
    _observer.trigger = function (triggerEventName) {
        var args = Array.prototype.slice.call(arguments,1);
        if (!_queue[triggerEventName]) return;
        for (var i = 0; i < _queue[triggerEventName].length; i++) {
            _queue[triggerEventName][i].apply(null, args);
        }
    },
    // 移除注冊事件
    _observer.remove = function (removeEventName) {
        for(var k in _queue) {
            if (k === removeEventName) {
                delete _queue[k];
            }
        }
    }
    // 移除所有注冊事件
    _observer.removeAll = function () {
        _queue = {};
    }
    return _observer;
}()
發(fā)布訂閱者模式與觀察者模式區(qū)別

發(fā)布訂閱者模式與觀察者模式是很相似的,之前的好多網(wǎng)站、博客上也把它們畫上等號,但是我前段時間接到一個面試,問我,發(fā)布訂閱者模式與觀察者模式有什么卻別,當(dāng)時說一樣的,結(jié)果面試管說其實不一樣,好吧,一臉懵逼,結(jié)束時候自己查閱了一下,確實不太一樣。

區(qū)別

在觀察者模式中,觀察者是知道Subject的,Subject一直保持對觀察者進行記錄。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對方的存在。它們只有通過調(diào)度中心進行通信。

在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。

觀察者模式大多數(shù)時候是同步的,比如當(dāng)事件觸發(fā),Subject就會去調(diào)用觀察者的方法。而發(fā)布-訂閱模式大多數(shù)時候是異步的(使用消息隊列)

舉個例子
觀察者模式就像你沒有經(jīng)驗卻買了比特幣或者股票,然后害怕賠錢一直盯著k線圖,一有變化立馬就知道了,然后做下一步操作,是觀望是買是拋都可以,熟悉vue的同學(xué)應(yīng)該知道watch這個方法吧,對,就是觀察者模式,國外有一圖拿過來給你們看看

參考

1.觀察者模式 vs 發(fā)布-訂閱模式
2.Observer vs Pub-Sub

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

  • 發(fā)布訂閱模式實現(xiàn)發(fā)布訂閱模式察者模式不同

    摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個事件觸發(fā),只知道事件觸發(fā)時候,會告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。 概念 發(fā)布訂閱者模式,是javascript甚至大多數(shù)語言都有的語言模式,比較概念的解釋是, 訂閱者把自己想訂閱的事件注冊到調(diào)度中心,當(dāng)該事件觸發(fā)時候,發(fā)布者發(fā)布...

    YanceyOfficial 評論0 收藏0
  • JavaScript 設(shè)計模式(六):察者模式發(fā)布訂閱模式

    摘要:觀察者模式維護單一事件對應(yīng)多個依賴該事件的對象關(guān)系發(fā)布訂閱維護多個事件主題及依賴各事件主題的對象之間的關(guān)系觀察者模式是目標(biāo)對象直接觸發(fā)通知全部通知,觀察對象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對象間一種一對多的依賴關(guān)系,當(dāng)目標(biāo)對象 Subject 的狀態(tài)發(fā)生改變時,所有依賴它的對象 Observer 都會得到通知。 簡單點:女神有男朋友了,朋友圈曬個圖,甜...

    bingo 評論0 收藏0
  • 設(shè)計模式察者模式發(fā)布訂閱模式

    摘要:觀察者模式與發(fā)布訂閱的區(qū)別在模式中,知道,同時還保留了的記錄。發(fā)布者訂閱者在大多情況下是異步方式使用消息隊列。圖片源于網(wǎng)絡(luò)侵權(quán)必刪如果以結(jié)構(gòu)來分辨模式,發(fā)布訂閱模式相比觀察者模式多了一個中間件訂閱器,所以發(fā)布訂閱模式是不同于觀察者模式的。 學(xué)習(xí)了一段時間設(shè)計模式,當(dāng)學(xué)到觀察者模式和發(fā)布訂閱模式的時候遇到了很大的問題,這兩個模式有點類似,有點傻傻分不清楚,博客起因如此,開始對觀察者和發(fā)布...

    BaronZhang 評論0 收藏0
  • 簡單理解察者模式(pub/sub)在前端中應(yīng)用

    摘要:概念觀察者模式被廣泛地應(yīng)用于客戶端編程中。所有的瀏覽器事件,等都是使用觀察者模式的例子。在觀察者模式中,一個對象訂閱另一個對象的指定活動并得到通知,而不是調(diào)用另一個對象的方法。此外,觀察者模式還可用于實現(xiàn)數(shù)據(jù)綁定。 概念 觀察者模式被廣泛地應(yīng)用于JavaScript客戶端編程中。所有的瀏覽器事件(mouseover,keypress等)都是使用觀察者模式的例子。這種模式的另一個名字叫自...

    guyan0319 評論0 收藏0
  • JavaScript 發(fā)布-訂閱模式

    摘要:發(fā)布訂閱模式訂閱者把自己想訂閱的事件注冊到調(diào)度中心,當(dāng)發(fā)布者發(fā)布該事件到調(diào)度中心,也就是該事件觸發(fā)時,由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊到調(diào)度中心的處理代碼。 發(fā)布-訂閱模式,看似陌生,其實不然。工作中經(jīng)常會用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他們都使用了發(fā)布-訂閱模式,讓開發(fā)變得更加高效方便。 一...

    13651657101 評論0 收藏0

發(fā)表評論

0條評論

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