色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

javascript設計模式 ? 職責鏈模式原理與用法實例分析

瀏覽:63日期:2023-11-03 16:36:36

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

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

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

場景:我們繼續畫圓,我們準備了兩組示例:

示例:

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以上 )

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

我們使用職責鏈模式重寫下:

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(’執行: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(’執行: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(’執行: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)// 執行:drawSmalCircle// 執行:drawMediumCircle// 執行:drawBigCircle// 畫一個大圓 ( 20以上 circle.draw(15)// 執行:drawSmalCircle// 執行:drawMediumCircle// 畫一個中圓 ( 10-20 )// 執行:drawBigCirclecircle.draw(5)// 執行:drawSmalCircle// 畫一個小圓( 10以下 )// 執行:drawMediumCircle// 執行:drawBigCircle

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

當我每執行一次draw時,程序會挨個執行職責鏈上的每一個方法。

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

職責鏈模式總結:

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

缺點:* 由于沒有明確接受者,可能職責鏈走到最后都沒有被正確處理。* 職責鏈較長時會導致系統性能受影響。* 建鏈不當,會造成循環調用,導致系統陷入死循環。

適用場景:* 多個對象處理同一請求* 動態創建執行順序,流程

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

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

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 亚州中文 | 91影视永久福利免费观看 | 久久精品7| 草草影院免费 | 日韩区在线观看 | 99久久精品国产一区二区成人 | 国产v片成人影院在线观看 国产v片在线播放免费观 | 极品精品国产超清自在线观看 | 一级做a爰片久久毛片美女 一级做a爰片久久毛片免费看 | www.亚洲天堂.com | 99视频在线精品免费观看18 | 一级做a爰片欧美一区 | 久久精品免费播放 | 日本中文字幕不卡免费视频 | 日韩欧美成人乱码一在线 | 97青青草原国产免费观看 | 欧美日韩亚洲一区二区三区在线观看 | 男的操美女| 久久成人小视频 | 国产1区2区三区不卡 | 天堂影院jav成人天堂免费观看 | 国产亚洲高清不卡在线观看 | 欧美一级成人一区二区三区 | 亚洲天堂国产精品 | 国产亚洲欧美日韩综合综合二区 | 亚洲欧美日本综合 | 久久精品视频免费观看 | 日本精品视频在线播放 | 女初高中福利视频在线观看 | 久久精品国产免费看久久精品 | 一本色道久久88综合亚洲精品高清 | 涩里番资源网站在线观看 | 2020久久国产最新免费观看 | 国产r67194吃奶视频 | 免费国产一级特黄久久 | 伊人成人在线 | 亚洲国产精品国产自在在线 | 美女视频黄视大全视频免费网址 | 欧美在线一区二区 | 精品国产午夜久久久久九九 | 国产在线更新 |