<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      深入理解JavaScript系列(38):設計模式之職責鏈模式

      2012-04-10 08:55  湯姆大叔  閱讀(11860)  評論(8)    收藏  舉報

      介紹

      職責鏈模式(Chain of responsibility)是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理他為止。

      也就是說,請求以后,從第一個對象開始,鏈中收到請求的對象要么親自處理它,要么轉發給鏈中的下一個候選者。提交請求的對象并不明確知道哪一個對象將會處理它——也就是該請求有一個隱式的接受者(implicit receiver)。根據運行時刻,任一候選者都可以響應相應的請求,候選者的數目是任意的,你可以在運行時刻決定哪些候選者參與到鏈中。

      正文

      對于JavaScript實現,我們可以利用其原型特性來實現職責鏈模式。

      var NO_TOPIC = -1;
      var Topic;

      function Handler(s, t) {
      this.successor = s || null;
      this.topic = t || 0;
      }

      Handler.prototype = {
      handle: function () {
      if (this.successor) {
      this.successor.handle()
      }
      },
      has: function () {
      return this.topic != NO_TOPIC;
      }
      };

      Handler只是接受2個參數,第一個是繼任者(用于將處理請求傳下去),第二個是傳遞層級(可以用于控制在某個層級下是否執行某個操作,也可以不用),Handler原型暴露了一個handle方法,這是實現該模式的重點,先來看看如何使用上述代碼。

          var app = new Handler({
      handle: function () {
      console.log('app handle');
      }
      }, 3);

      var dialog = new Handler(app, 1);

      var button = new Handler(dialog, 2);

      button.handle();

      改代碼通過原型特性,調用代碼從button.handle()->dialog.handle()->app.handle()->參數里的handle(),前三個都是調用原型的handle,最后才查找到傳入的參數里的handle,然后輸出結果,也就是說其實只有最后一層才處理。

      那如何做到調用的時候,只讓dialog的這個對象進行處理呢?其實可以定義dialog實例對象的handle方法就可以了,但需要在new button的之前來做,代碼如下:

          var app = new Handler({
      handle: function () {
      console.log('app handle');
      }
      }, 3);

      var dialog = new Handler(app, 1);
      dialog.handle = function () {
      console.log('dialog before ...')
      // 這里做具體的處理操作
      console.log('dialog after ...')
      };

      var button = new Handler(dialog, 2);

      button.handle();

      該代碼的執行結果即時dialog.handle里的處理結果,而不再是給app傳入的參數里定義的handle的執行操作。

      那能不能做到自身處理完以后,然后在讓繼任者繼續處理呢?答案是肯定的,但是在調用的handle以后,需要利用原型的特性調用如下代碼:

      Handler.prototype.handle.call(this);

      該句話的意思說,調用原型的handle方法,來繼續調用其繼任者(也就是successor )的handle方法,以下代碼表現為:button/dialog/app三個對象定義的handle都會執行。

      var app = new Handler({
      handle: function () {
      console.log('app handle');
      }
      }, 3);

      var dialog = new Handler(app, 1);
      dialog.handle = function () {
      console.log('dialog before ...')
      // 這里做具體的處理操作
      Handler.prototype.handle.call(this); //繼續往上走
      console.log('dialog after ...')
      };

      var button = new Handler(dialog, 2);
      button.handle = function () {
      console.log('button before ...')
      // 這里做具體的處理操作
      Handler.prototype.handle.call(this);
      console.log('button after ...')
      };

      button.handle();

      通過代碼的運行結果我們可以看出,如果想先自身處理,然后再調用繼任者處理的話,就在末尾執行Handler.prototype.handle.call(this);代碼,如果想先處理繼任者的代碼,就在開頭執行Handler.prototype.handle.call(this);代碼。

      總結

      職責鏈模式經常和組合模式一起使用,這樣一個構件的父構件可以作為其繼任者。

      同時,DOM里的事件冒泡機制也和此好像有點類似,比如點擊一個按鈕以后,如果不阻止冒泡,其click事件將一直向父元素冒泡,利用這個機制也可以處理很多相關的問題,比如本系列設計模式享元模式里的《例1:事件集中管理》的示例代碼。

      參考代碼:https://gist.github.com/1174982

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 中文字幕av日韩有码| 超碰成人人人做人人爽| 国产精品中文字幕视频| 久久婷婷五月综合97色直播| 一级做a爰片在线播放| 亚洲成人四虎在线播放| 老师破女学生处特级毛ooo片| 精品亚洲没码中文字幕| 久久久无码精品亚洲日韩蜜桃| 国产精品毛片av999999| 精品无码国产自产拍在线观看蜜| 国产精品无码av天天爽播放器 | 国产一区二区三区九精品| 洛川县| 亚洲综合av一区二区三区| 18禁成人免费无码网站| 在线a级毛片无码免费真人| 国产精品黄色片| 伊人蕉久影院| 亚洲av综合色一区二区| 亚洲欧美在线观看品| 国产精品亚洲一区二区z| 亚洲乱色伦图片区小说| 久久精品国产精品第一区| 一区二区中文字幕久久| 精品国产成人午夜福利| 亚洲午夜无码久久久久小说| 九九九国产| 国产亚洲人成网站在线观看| 久久久久国精品产熟女久色| 久久精品久久精品久久精品| 亚洲中文字幕日产无码成人片| 久久人与动人物a级毛片 | 久久99热只有频精品8| 国产午夜精品福利91| 中文字幕乱码十国产乱码| 色就色中文字幕在线视频| 成全影视大全在线观看| 久久中文字幕无码专区| 亚洲中文字幕综合网在线| 中文字幕有码高清日韩|