什么是職責鏈模式
職責鏈模式的定義是:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。舉個例子:當你從公交車后門上車之后,你不可能直接把硬幣放到收款箱里面, 因為你不知道它在哪,那你就只能把硬幣給你前面一個人,讓他幫你傳到前面一個人手上,這樣一直傳遞到站在收款箱旁邊人的手上,由他把硬幣放到收款箱里面。
職責鏈模式思想
請求發送者只需要知道鏈中的第一個節點,從而弱化了發送者和一組接收者之間的強聯系。
JavaScript實現職責鏈模式(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中實現職責鏈模式就是如此的簡單,如果對上面AOP代碼不了解可以參考我之前寫的這篇文章JavaScript實現AOP,這個方式和裝飾者模式看起來很像,從代碼上來看確實很像,但是他們的出發點是完全不同的
AOP實現裝飾者模式:在不改變已有函數內部的情況下添加一些新的功能,你可以想象一下同心圓,你每調用一次after,就相當于給你的圓外面又加了一個圓來包裹住它。注意它們是包含關系
AOP實現職責鏈模式:在函數執行之后確定是否執行下一個函數,你每次調用after,都相當于在已有函數之后添加一個函數,至于是否執行后面這個函數,取決于前一個函數的返回值。注意它們是鏈式關系
職責鏈模式實例
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方法傳入了三個不同的參數,得到了不同的結果。拿第一次調用舉例,其執行過程是這樣的:傳入“pig”,先由cat方法判斷,cat方法發現自己處理不了,于是把“pig”傳遞給dog方法(return "nextSuccessor"來表示傳遞給下一個函數),dog方法發現自己也處理不了,再接著把“pig”傳遞到pig方法,pig方法可以處理,控制臺打印,我是豬豬。
新聞熱點
疑難解答
圖片精選