什么是職責(zé)鏈模式
創(chuàng)新互聯(lián)公司主營(yíng)黃埔網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,App定制開(kāi)發(fā),黃埔h5微信平臺(tái)小程序開(kāi)發(fā)搭建,黃埔網(wǎng)站營(yíng)銷推廣歡迎黃埔等地區(qū)企業(yè)咨詢
職責(zé)鏈模式的定義是:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系,將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。舉個(gè)例子:當(dāng)你從公交車后門上車之后,你不可能直接把硬幣放到收款箱里面, 因?yàn)槟悴恢浪谀模悄憔椭荒馨延矌沤o你前面一個(gè)人,讓他幫你傳到前面一個(gè)人手上,這樣一直傳遞到站在收款箱旁邊人的手上,由他把硬幣放到收款箱里面。
職責(zé)鏈模式思想
請(qǐng)求發(fā)送者只需要知道鏈中的第一個(gè)節(jié)點(diǎn),從而弱化了發(fā)送者和一組接收者之間的強(qiáng)聯(lián)系。
JavaScript實(shí)現(xiàn)職責(zé)鏈模式(AOP方式)
Function.prototype.after = function(fn) { var _self = this; return function () { var ret = _self.apply(this, arguments); if(ret === "nextSuccessor") { return fn.apply(this, arguments); } return ret; } }
是的沒(méi)錯(cuò),在JavaScript中實(shí)現(xiàn)職責(zé)鏈模式就是如此的簡(jiǎn)單,如果對(duì)上面AOP代碼不了解可以參考我之前寫(xiě)的這篇文章JavaScript實(shí)現(xiàn)AOP,這個(gè)方式和裝飾者模式看起來(lái)很像,從代碼上來(lái)看確實(shí)很像,但是他們的出發(fā)點(diǎn)是完全不同的
AOP實(shí)現(xiàn)裝飾者模式:在不改變已有函數(shù)內(nèi)部的情況下添加一些新的功能,你可以想象一下同心圓,你每調(diào)用一次after,就相當(dāng)于給你的圓外面又加了一個(gè)圓來(lái)包裹住它。注意它們是包含關(guān)系
AOP實(shí)現(xiàn)職責(zé)鏈模式:在函數(shù)執(zhí)行之后確定是否執(zhí)行下一個(gè)函數(shù),你每次調(diào)用after,都相當(dāng)于在已有函數(shù)之后添加一個(gè)函數(shù),至于是否執(zhí)行后面這個(gè)函數(shù),取決于前一個(gè)函數(shù)的返回值。注意它們是鏈?zhǔn)疥P(guān)系
職責(zé)鏈模式實(shí)例
function cat (type) { if(type == "cat") { console.log("我是貓貓"); } else { return "nextSuccessor" } } function dog (type) { if(type == "dog") { console.log("我是狗狗"); } else { return "nextSuccessor" } } function pig (type) { if(type == "pig") { console.log("我是豬豬"); } else { return "nextSuccessor" } } Function.prototype.after = function(fn) { var _self = this; return function () { var ret = _self.apply(this, arguments); if(ret === "nextSuccessor") { return fn.apply(this, arguments); } return ret; } } var pet = cat.after(dog).after(pig); pet("pig"); //我是豬豬 pet("dog"); //我是狗狗 pet("cat"); //我是貓貓
請(qǐng)看上述代碼,我們給pet方法傳入了三個(gè)不同的參數(shù),得到了不同的結(jié)果。拿第一次調(diào)用舉例,其執(zhí)行過(guò)程是這樣的:傳入“pig”,先由cat方法判斷,cat方法發(fā)現(xiàn)自己處理不了,于是把“pig”傳遞給dog方法(return "nextSuccessor"來(lái)表示傳遞給下一個(gè)函數(shù)),dog方法發(fā)現(xiàn)自己也處理不了,再接著把“pig”傳遞到pig方法,pig方法可以處理,控制臺(tái)打印,我是豬豬。
你可能會(huì)覺(jué)得這不是浪費(fèi)精神么,上述功能只需使用下面的幾行代碼就能解決,為何還要多寫(xiě)上面那么多代碼
function pet(type) { if(type == "cat") { console.log("我是貓貓"); } else if(type == "dog") { console.log("我是狗狗"); } else if(type == "pig") { console.log("我是豬豬"); } } pet("pig"); //我是豬豬 pet("dog"); //我是狗狗 pet("cat"); //我是貓貓
這樣看來(lái),好像是簡(jiǎn)單了很多。但是你有沒(méi)有考慮過(guò),如果以后突然多了猴子這種動(dòng)物,如果使用上面的垃圾代碼,那你就要去修改pet函數(shù)的源碼,多添加一條if語(yǔ)句判斷是不是猴子,其實(shí)這也還好,如果是加了1萬(wàn)種動(dòng)物呢?那你就要在pet這個(gè)函數(shù)里添加1萬(wàn)條if語(yǔ)句,什么?還不夠浮夸?那你有沒(méi)有考慮過(guò)一種動(dòng)物還會(huì)分很多品種,比如說(shuō)貓咪分為長(zhǎng)毛貓,短毛貓。這樣你的代碼就會(huì)涉及到嵌套if語(yǔ)句。恕我直言,現(xiàn)在你的代碼已經(jīng)丑成狗了,嘻嘻
但是如果使用職責(zé)鏈模式,每多一個(gè)種動(dòng)物,我們就給他定義一個(gè)函數(shù),然后添加到職責(zé)鏈上,這樣一來(lái),新的函數(shù)就和原來(lái)的函數(shù)高度解耦,豈不美哉?
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前題目:JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述
網(wǎng)站地址:http://redsoil1982.com.cn/article24/gsoece.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、域名注冊(cè)、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、面包屑導(dǎo)航、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)