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

資訊專欄INFORMATION COLUMN

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

劉東 / 817人閱讀

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

觀察者模式(Observer)

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

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

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

具體代碼實現(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 );
};

//目標
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ā)布訂閱模式與觀察者模式不同之處就在于,添加了一個中介(調(diào)度中心)來避免發(fā)布者和訂閱者之間產(chǎn)生依賴關(guān)系。

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

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

具體代碼實現(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 ));

參考文獻:《Learning JavaScript Design Patterns》

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

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

相關(guān)文章

  • 設計模式察者模式發(fā)布訂閱模式

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

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

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

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

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

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

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

    bingo 評論0 收藏0

發(fā)表評論

0條評論

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