电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:68日期: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
相關文章:
主站蜘蛛池模板: 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 模具钢_高速钢_不锈钢-万利钢金属材料 | LINK FASHION 童装·青少年装展 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | 广东成考网-广东成人高考网 | 国际金融网_每日财经新资讯网 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 |