JavaScript實現職責鏈模式

來源:互聯網
上載者:User

標籤:參數   apply   sel   log   pig   語句   裝飾者模式   改變   調用   

什麼是職責鏈模式

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

 

職責鏈模式思想

  請求寄件者只需要知道鏈中的第一個節點,從而弱化了寄件者和一組接收者之間的強聯絡。

 

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方法可以處理,控制台列印,我是豬豬。

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

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函數的源碼,多添加一條if語句判斷是不是猴子,其實這也還好,如果是加了1萬種動物呢?那你就要在pet這個函數裡添加1萬條if語句,什嗎?還不夠浮誇?那你有沒有考慮過一種動物還會分很多品種,比如說貓咪分為長毛貓,短毛貓。這樣你的代碼就會涉及到嵌套if語句。恕我直言,現在你的代碼已經醜成狗了,嘻嘻

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

 

 

 

    

JavaScript實現職責鏈模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.