日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript实现职责链模式

發(fā)布時間:2023/11/30 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript实现职责链模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是職責鏈模式

  職責鏈模式的定義是:使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。舉個例子:當你從公交車后門上車之后,你不可能直接把硬幣放到收款箱里面, 因為你不知道它在哪,那你就只能把硬幣給你前面一個人,讓他幫你傳到前面一個人手上,這樣一直傳遞到站在收款箱旁邊人的手上,由他把硬幣放到收款箱里面。

?

職責鏈模式思想

  請求發(fā)送者只需要知道鏈中的第一個節(jié)點,從而弱化了發(fā)送者和一組接收者之間的強聯(lián)系。

?

JavaScript實現(xiàn)職責鏈模式(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;}}

  是的沒錯,在JavaScript中實現(xiàn)職責鏈模式就是如此的簡單,如果對上面AOP代碼不了解可以參考我之前寫的這篇文章JavaScript實現(xiàn)AOP,這個方式和裝飾者模式看起來很像,從代碼上來看確實很像,但是他們的出發(fā)點是完全不同的

  AOP實現(xiàn)裝飾者模式:在不改變已有函數(shù)內(nèi)部的情況下添加一些新的功能,你可以想象一下同心圓,你每調(diào)用一次after,就相當于給你的圓外面又加了一個圓來包裹住它。注意它們是包含關系

  AOP實現(xiàn)職責鏈模式:在函數(shù)執(zhí)行之后確定是否執(zhí)行下一個函數(shù),你每次調(diào)用after,都相當于在已有函數(shù)之后添加一個函數(shù),至于是否執(zhí)行后面這個函數(shù),取決于前一個函數(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"); //我是貓貓

  請看上述代碼,我們給pet方法傳入了三個不同的參數(shù),得到了不同的結(jié)果。拿第一次調(diào)用舉例,其執(zhí)行過程是這樣的:傳入“pig”,先由cat方法判斷,cat方法發(fā)現(xiàn)自己處理不了,于是把“pig”傳遞給dog方法(return "nextSuccessor"來表示傳遞給下一個函數(shù)),dog方法發(fā)現(xiàn)自己也處理不了,再接著把“pig”傳遞到pig方法,pig方法可以處理,控制臺打印,我是豬豬。

你可能會覺得這不是浪費精神么,上述功能只需使用下面的幾行代碼就能解決,為何還要多寫上面那么多代碼

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"); //我是貓貓

  這樣看來,好像是簡單了很多。但是你有沒有考慮過,如果以后突然多了猴子這種動物,如果使用上面的垃圾代碼,那你就要去修改pet函數(shù)的源碼,多添加一條if語句判斷是不是猴子,其實這也還好,如果是加了1萬種動物呢?那你就要在pet這個函數(shù)里添加1萬條if語句,什么?還不夠浮夸?那你有沒有考慮過一種動物還會分很多品種,比如說貓咪分為長毛貓,短毛貓。這樣你的代碼就會涉及到嵌套if語句。恕我直言,現(xiàn)在你的代碼已經(jīng)丑成狗了,嘻嘻

  但是如果使用職責鏈模式,每多一個種動物,我們就給他定義一個函數(shù),然后添加到職責鏈上,這樣一來,新的函數(shù)就和原來的函數(shù)高度解耦。并且我們的請求發(fā)送者只需要傳遞給鏈的第一個節(jié)點,而不用關心傳遞給具體哪一個節(jié)點,反正它會順著職責鏈傳送下去,直到找到能處理請求的那個節(jié)點,并且處理請求。豈不美哉?

?

?

?

    

轉(zhuǎn)載于:https://www.cnblogs.com/yonglin/p/8339239.html

總結(jié)

以上是生活随笔為你收集整理的JavaScript实现职责链模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。