亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

觀察者模式與發(fā)布-訂閱模式

劉東 / 868人閱讀

摘要:觀察者模式觀察者模式一個(gè)對象主體根據(jù)它維護(hù)的一個(gè)對象列表觀察者,自動通知它們狀態(tài)的任何變化。觀察者模式是由具體目標(biāo)直接調(diào)度的操作而發(fā)布訂閱模式是在調(diào)度中心調(diào)度,發(fā)布者與訂閱者不產(chǎn)生依賴。

觀察者模式(Observer)

觀察者模式:一個(gè)對象(主體)根據(jù)它維護(hù)的一個(gè)對象列表(觀察者),自動通知它們狀態(tài)的任何變化。(舉例說明,電商平臺關(guān)注(訂閱)一家店鋪(發(fā)布者)的鞋子,當(dāng)鞋子上架之后店鋪就會發(fā)送消息給用戶(訂閱者);用戶(訂閱者)可以通過取消訂閱來取消推送消息接收。)

實(shí)際上是:主體對觀察者傳遞消息通知,觀察者必須將該消息通知訂閱到觸發(fā)事件對象上。

關(guān)系鏈: 目標(biāo) <--- 繼承 --- 具體目標(biāo)(發(fā)布者)< -- 訂閱 -- 調(diào)度觀察者 --- > 具體觀察者(訂閱者) --- 繼承 ---> 觀察者

具體代碼實(shí)現(xiàn):

//觀察者列表
function ObserverList(){
  this.observerList = [];
}
ObserverList.prototype.add = function( obj ){
  return this.observerList.push( obj );
};
ObserverList.prototype.count = function(){
  return this.observerList.length;
};
ObserverList.prototype.get = function( index ){
  if( index > -1 && index < this.observerList.length ){
    return this.observerList[ index ];
  }
};
ObserverList.prototype.indexOf = function( obj, startIndex ){
  var i = startIndex;
  while( i < this.observerList.length ){
    if( this.observerList[i] === obj ){
      return i;
    }
    i++;
  }
  return -1;
};
ObserverList.prototype.removeAt = function( index ){
  this.observerList.splice( index, 1 );
};

//目標(biāo)
function Subject(){
  this.observers = new ObserverList();
}
Subject.prototype.addObserver = function( observer ){
  this.observers.add( observer );
};
Subject.prototype.removeObserver = function( observer ){
  this.observers.removeAt( this.observers.indexOf( observer, 0 ) );
};
Subject.prototype.notify = function( context ){
  var observerCount = this.observers.count();
  for(var i=0; i < observerCount; i++){
    this.observers.get(i).update( context );
  }
};

//觀察者
function Observer(){
  this.update = function(){
    // 自定義行為
  };
}
發(fā)布-訂閱模式

發(fā)布訂閱模式:觀察者模式也可以說是發(fā)布訂閱模式,然而發(fā)布訂閱模式與觀察者模式不同之處就在于,添加了一個(gè)中介(調(diào)度中心)來避免發(fā)布者和訂閱者之間產(chǎn)生依賴關(guān)系。

關(guān)系鏈: 訂閱者(數(shù)量不限) --- 訂閱 ---> 調(diào)度中心 <--- 發(fā)布 --- 發(fā)布者(不直接發(fā)布)

兩種模式的區(qū)別:觀察兩種模式其實(shí)發(fā)現(xiàn),模式的基本思想是一致的,僅僅是在調(diào)度是否是直接調(diào)度上有所不同。觀察者模式是由具體目標(biāo)直接調(diào)度的(eg: dom操作);而發(fā)布訂閱模式是在調(diào)度中心調(diào)度,發(fā)布者與訂閱者不產(chǎn)生依賴。

具體代碼實(shí)現(xiàn):

var pubsub = {};
(function(myObject) {
    // Storage for topics that can be broadcast
    // or listened to
    var topics = {};
    // An topic identifier
    var subUid = -1;
    // Publish or broadcast events of interest
    // with a specific topic name and arguments
    // such as the data to pass along
    myObject.publish = function( topic, args ) {
        if ( !topics[topic] ) {
            return false;
        }
        var subscribers = topics[topic],
            len = subscribers ? subscribers.length : 0;
        while (len--) {
            subscribers[len].func( topic, args );
        }
        return this;
    };
    // Subscribe to events of interest
    // with a specific topic name and a
    // callback function, to be executed
    // when the topic/event is observed
    myObject.subscribe = function( topic, func ) {
        if (!topics[topic]) {
            topics[topic] = [];
        }
        var token = ( ++subUid ).toString();
        topics[topic].push({
            token: token,
            func: func
        });
        return token;
    };
    // Unsubscribe from a specific
    // topic, based on a tokenized reference
    // to the subscription
    myObject.unsubscribe = function( token ) {
        for ( var m in topics ) {
            if ( topics[m] ) {
                for ( var i = 0, j = topics[m].length; i < j; i++ ) {
                    if ( topics[m][i].token === token ) {
                        topics[m].splice( i, 1 );
                        return token;
                    }
                }
            }
        }
        return this;
    };
}( pubsub ));

參考文獻(xiàn):《Learning JavaScript Design Patterns》

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

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

相關(guān)文章

  • 設(shè)計(jì)模式察者模式發(fā)布訂閱模式

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

    BaronZhang 評論0 收藏0
  • 發(fā)布訂閱模式實(shí)現(xiàn)及發(fā)布訂閱模式察者模式的不同

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

    YanceyOfficial 評論0 收藏0
  • 發(fā)布訂閱模式實(shí)現(xiàn)及發(fā)布訂閱模式察者模式的不同

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

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

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

    bingo 評論0 收藏0

發(fā)表評論

0條評論

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