国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript實現職責鏈模式概述

2019-11-19 14:28:41
字體:
來源:轉載
供稿:網友

什么是職責鏈模式

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

職責鏈模式思想

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

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語句。恕我直言,現在你的代碼已經丑成狗了,嘻嘻

但是如果使用職責鏈模式,每多一個種動物,我們就給他定義一個函數,然后添加到職責鏈上,這樣一來,新的函數就和原來的函數高度解耦,豈不美哉?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桦南县| 依安县| 彭山县| 永丰县| 枞阳县| 且末县| 新民市| 北海市| 平泉县| 二连浩特市| 紫金县| 五常市| 株洲市| 巴林左旗| 双桥区| 溧阳市| 武汉市| 甘孜县| 乌兰察布市| 孟连| 大关县| 曲水县| 铜鼓县| 文水县| 大竹县| 崇仁县| 安岳县| 华坪县| 彭水| 泸州市| 深州市| 建瓯市| 城口县| 崇信县| 二手房| 东山县| 兴义市| 尤溪县| 四子王旗| 红河县| 上饶市|