最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript設(shè)計模式 – 職責(zé)鏈模式原理與用法實例分析

 更新時間:2020年04月16日 08:40:49   作者:李小強(qiáng)  
這篇文章主要介紹了javascript設(shè)計模式 – 職責(zé)鏈模式,結(jié)合實例形式分析了javascript職責(zé)鏈模式相關(guān)概念、原理、用法及操作注意事項,需要的朋友可以參考下

本文實例講述了javascript設(shè)計模式 – 職責(zé)鏈模式原理與用法。分享給大家供大家參考,具體如下:

介紹:很多情況下,在一個軟件系統(tǒng)中可以處理某個請求的對象不止一個。例如一個網(wǎng)絡(luò)請求過來,需要有對象去解析request Body,需要有對象去解析請求頭,還需要有對象去對執(zhí)行對應(yīng)controller。請求一層層傳遞,讓每一個對象都基于請求完成自己的任務(wù),然后將請求傳遞給下一個處理程序。是不是感覺有點中間件的感覺。

定義:職責(zé)鏈就是避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求。將這些對象連成一條鏈,并沿著鏈傳遞請求,直到有對象處理它為止。職責(zé)鏈模式是一種對象行為型模式。

場景:我們繼續(xù)畫圓,我們準(zhǔn)備了兩組示例:

示例:

var Circle = function(){
  this.radius = 0;
 
  this.drawByRadius = function(radius){
    if(radius < 5){
      this.drawVerySmalCircle();
    }else if(radius < 10){
      this.drawSmalCircle();
    }else if(radius < 15){
      this.drawMediumCircle();
    }else if(radius < 20){
      this.drawBigCircle();
    }else{
      this.drawVeryBigCircle();
    }
  }
 
  this.drawVerySmalCircle = function(){
    console.log('畫一個超小的圓( 5以下 )');
  }
  this.drawSmalCircle = function(){
    console.log('畫一個小圓( 5-10 )');
  }
  this.drawMediumCircle = function(){
    console.log('畫一個中圓 ( 10-15 )');
  }
  this.drawBigCircle = function(){
    console.log('畫一個大圓 ( 15-20 )');
  }
  this.drawVeryBigCircle = function(){
    console.log('畫一個超大的圓 ( 20以上 )');
  }
}
 
var circle = new Circle();
circle.drawByRadius(30);
//畫一個超大的圓 ( 20以上 )

觀察上面的代碼,這是很常見的邏輯,通過參數(shù)來決定執(zhí)行哪個方法。首先drawByRadius方法職責(zé)過重,其次這樣的方式在修改,新增時需要修改源代碼,不符合開關(guān)原則。

我們使用職責(zé)鏈模式重寫下:

var drawSmalCircle = function(min,max){
  this.max = max;
  this.min = min;
  this.nextCircle;
  this.setNextDraw = function(circle){
    this.nextCircle = circle;
  }
  this.draw = function(radius){
    console.log('執(zhí)行:drawSmalCircle');
    if(this.min < radius && radius < this.max){
      console.log('畫一個小圓( 10以下 )');
    }
    if(this.nextCircle){
      this.nextCircle.draw(radius)
    }
  }
}
 
var drawMediumCircle = function(min,max){
  this.max = max;
  this.min = min;
  this.nextCircle;
  this.setNextDraw = function(circle){
    this.nextCircle = circle;
  }
  this.draw = function(radius){
    console.log('執(zhí)行:drawMediumCircle');
    if(this.min < radius && radius < this.max){
      console.log('畫一個中圓 ( 10-20 )');
    }
    if(this.nextCircle){
      this.nextCircle.draw(radius)
    }
  }
}
 
var drawBigCircle = function(min,max){
  this.max = max;
  this.min = min;
  this.nextCircle;
  this.setNextDraw = function(circle){
    this.nextCircle = circle;
  }
  this.draw = function(radius){
    console.log('執(zhí)行:drawBigCircle');
    if(this.min < radius && radius < this.max){
      console.log('畫一個大圓 ( 20以上 )');
    }
    if(this.nextCircle){
      this.nextCircle.draw(radius)
    }
  }
}
 
function initChain(){
  var smalCircle = new drawSmalCircle(0,10);
  var mediumCircle = new drawMediumCircle(10,20);
  var bigCircle = new drawBigCircle(20,100);
 
  smalCircle.setNextDraw(mediumCircle);
  mediumCircle.setNextDraw(bigCircle);
  return smalCircle;
}
 
var circle = initChain();
circle.draw(30)
// 執(zhí)行:drawSmalCircle
// 執(zhí)行:drawMediumCircle
// 執(zhí)行:drawBigCircle
// 畫一個大圓 ( 20以上 
circle.draw(15)
// 執(zhí)行:drawSmalCircle
// 執(zhí)行:drawMediumCircle
// 畫一個中圓 ( 10-20 )
// 執(zhí)行:drawBigCircle
circle.draw(5)
// 執(zhí)行:drawSmalCircle
// 畫一個小圓( 10以下 )
// 執(zhí)行:drawMediumCircle
// 執(zhí)行:drawBigCircle

以上就是職責(zé)鏈模式的實例代碼,drawSmalCircle,drawMediumCircle,drawBigCircle稱為處理者類,處理者類保存了下一級對象的引用,

當(dāng)我每執(zhí)行一次draw時,程序會挨個執(zhí)行職責(zé)鏈上的每一個方法。

職責(zé)鏈模式分為純職責(zé)鏈和不純職責(zé)鏈,純的職責(zé)鏈在處理請求時,只能選擇全部處理不傳遞或者全部傳遞不處理。我們這里的例子就是不純職責(zé)鏈。它允許處理完成后繼續(xù)向后傳遞。

職責(zé)鏈模式總結(jié):

優(yōu)點:
* 降低耦合,互相都不清楚執(zhí)行順序以及執(zhí)行處理的類。
* 請求對象僅需維持一個指向其后繼者的引用,簡化了對象的相互連接。
* 新增修改職責(zé)鏈結(jié)構(gòu)方便,滿足開關(guān)原則。

缺點:
* 由于沒有明確接受者,可能職責(zé)鏈走到最后都沒有被正確處理。
* 職責(zé)鏈較長時會導(dǎo)致系統(tǒng)性能受影響。
* 建鏈不當(dāng),會造成循環(huán)調(diào)用,導(dǎo)致系統(tǒng)陷入死循環(huán)。

適用場景:
* 多個對象處理同一請求
* 動態(tài)創(chuàng)建執(zhí)行順序,流程

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • JS實現(xiàn)手寫 forEach算法示例

    JS實現(xiàn)手寫 forEach算法示例

    這篇文章主要介紹了JS實現(xiàn)手寫 forEach算法,結(jié)合實例形式分析了JS實現(xiàn)手寫 forEach算法實現(xiàn)原理與相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04
  • ES6 解構(gòu)賦值的原理及運用

    ES6 解構(gòu)賦值的原理及運用

    ES6允許按照一定模式從數(shù)組或?qū)ο笾刑崛≈?,然后對變量進(jìn)行賦值,稱為解構(gòu)。只要等號兩邊的模式相同,左邊的變量就會被賦予對應(yīng)的值,這種寫法屬于“模式匹配”。統(tǒng)稱起來就叫做“解構(gòu)賦值”。
    2021-05-05
  • javascript特殊文本輸入框網(wǎng)頁特效

    javascript特殊文本輸入框網(wǎng)頁特效

    這篇文章主要為大家詳細(xì)介紹了javascript特殊文本輸入框網(wǎng)頁特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • BootStrap 動態(tài)添加驗證項和取消驗證項的實現(xiàn)方法

    BootStrap 動態(tài)添加驗證項和取消驗證項的實現(xiàn)方法

    這篇文章主要介紹了BootStrap 動態(tài)添加驗證項和取消驗證項的實現(xiàn)方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Code Review 方法論與實踐總結(jié)梳理

    Code Review 方法論與實踐總結(jié)梳理

    這篇文章主要為大家介紹了Code Review 方法論與實踐總結(jié)梳理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 利用Query+bootstrap和js兩種方式實現(xiàn)日期選擇器

    利用Query+bootstrap和js兩種方式實現(xiàn)日期選擇器

    日期選擇器在我們平時開發(fā)的時候經(jīng)常要用到,下面這篇文章主要給大家介紹了利用Query+bootstrap和js這兩種方式實現(xiàn)日期選擇器的方法,文中兩種方法都給出了詳細(xì)的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • JavaScript?ES6模塊導(dǎo)入和導(dǎo)出的方法

    JavaScript?ES6模塊導(dǎo)入和導(dǎo)出的方法

    ES6在語言標(biāo)準(zhǔn)的層面上實現(xiàn)了模塊功能,而且實現(xiàn)的相當(dāng)簡單,完全可以取代CommonJS和AMD規(guī)范,成為瀏覽器和服務(wù)器通用的模塊解決方案,下面這篇文章主要給大家介紹了關(guān)于ES6模塊導(dǎo)入和導(dǎo)出的方法,需要的朋友可以參考下
    2022-07-07
  • ES6解構(gòu)賦值實例詳解

    ES6解構(gòu)賦值實例詳解

    這篇文章主要介紹了ES6解構(gòu)賦值,結(jié)合實例形式較為詳細(xì)的分析了ES6結(jié)構(gòu)賦值的基本概念、原理與使用方法,需要的朋友可以參考下
    2017-10-10
  • js使下拉列表框可編輯不止是選擇

    js使下拉列表框可編輯不止是選擇

    下拉列表框默認(rèn)情況下是不可編輯的,下面為大家介紹個不錯的方法可以使下拉列表框可編輯,具體實現(xiàn)如下,需要的朋友可以參考下
    2013-12-12
  • 淺談js中的變量名和函數(shù)名重名

    淺談js中的變量名和函數(shù)名重名

    下面小編就為大家?guī)硪黄獪\談js中的變量名和函數(shù)名重名。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

济阳县| 祁东县| 阳山县| 永城市| 临沭县| 昌都县| 石景山区| 东方市| 湟中县| 河曲县| 顺平县| 玉树县| 阿图什市| 义马市| 徐汇区| 河北省| 民乐县| 凯里市| 内黄县| 吴忠市| 静海县| 南安市| 宝应县| 孟津县| 潢川县| 分宜县| 桓台县| 沅陵县| 通城县| 云浮市| 米易县| 万山特区| 泰和县| 抚远县| 科尔| 邵武市| 疏勒县| 雷州市| 巴林左旗| 江华| 长武县|