欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述

 更新時間:2018年01月25日 10:20:18   作者:三十億少女的夢  
這篇文章主要介紹了JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述,詳細(xì)的介紹了什么是職責(zé)鏈模式和實(shí)現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是職責(zé)鏈模式

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

職責(zé)鏈模式思想

請求發(fā)送者只需要知道鏈中的第一個節(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;
  }
 }

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

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

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用layui實(shí)現(xiàn)的左側(cè)菜單欄以及動態(tài)操作tab項(xiàng)方法

    使用layui實(shí)現(xiàn)的左側(cè)菜單欄以及動態(tài)操作tab項(xiàng)方法

    今天小編就為大家分享一篇使用layui實(shí)現(xiàn)的左側(cè)菜單欄以及動態(tài)操作tab項(xiàng)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • CocosCreator經(jīng)典入門項(xiàng)目之flappybird

    CocosCreator經(jīng)典入門項(xiàng)目之flappybird

    這篇文章主要介紹了CocosCreator經(jīng)典入門項(xiàng)目之flappybird,詳細(xì)說明了制作的每個步驟,還有詳盡的代碼,對CocosCreator感興趣的同學(xué),一定要看一下
    2021-04-04
  • 原生JS無縫滑動輪播圖

    原生JS無縫滑動輪播圖

    這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)淡出淡入輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 老生常談js中的MVC

    老生常談js中的MVC

    下面小編就為大家?guī)硪黄仙U刯s中的MVC。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • CSS3 動畫卡頓性能優(yōu)化的完美解決方案

    CSS3 動畫卡頓性能優(yōu)化的完美解決方案

    今天小編就為大家分享一篇關(guān)于css3 動畫卡頓性能優(yōu)化的完美解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-09-09
  • 一文帶你理解JS中的原型和原型鏈

    一文帶你理解JS中的原型和原型鏈

    在學(xué)習(xí)JavaScript中的繼承機(jī)制時,我們常常會遇到原型和原型鏈這兩個概念,在初學(xué)階段,不理解這些概念很容易陷入迷茫,甚至?xí)?dǎo)致學(xué)習(xí) JS 的路程變得曲折,本文將介紹JavaScript原型和原型鏈的概念、設(shè)計(jì)思想以及相關(guān)的使用方法,需要的朋友可以參考下
    2023-07-07
  • javascript輸入CD-KEY自動分割的代碼

    javascript輸入CD-KEY自動分割的代碼

    開發(fā)過程中用寫的一個腳本,記錄下來以備后用與他用,其中attributes["max"].nodeValue是取HTML自定義的 max屬性(兼容Firefox和IE)
    2010-10-10
  • js判斷游覽器類型及版本號的代碼

    js判斷游覽器類型及版本號的代碼

    今天分析一下, 終于找到原因. 舊版本的js文件寫的瀏覽器判斷有異常, 所以導(dǎo)致插入點(diǎn)一直在頭部. 今天修復(fù)之
    2014-05-05
  • 微信小程序組件化開發(fā)的示例介紹

    微信小程序組件化開發(fā)的示例介紹

    雖然小程序在剛推出時是不支持組件化的,但如今小程序開始支持自定義組件開發(fā),下面這篇文章主要給大家介紹了關(guān)于微信小程序組件化開發(fā)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 通過seajs實(shí)現(xiàn)JavaScript的模塊開發(fā)及按模塊加載

    通過seajs實(shí)現(xiàn)JavaScript的模塊開發(fā)及按模塊加載

    seajs實(shí)現(xiàn)了JavaScript 的 模塊開發(fā)及按模塊加載。用來解決繁瑣的js命名沖突,文件依賴等問題,其主要目的是令JavaScript開發(fā)模塊化并可以輕松愉悅進(jìn)行加載。下面我們來一起深入學(xué)習(xí)下吧
    2019-06-06

最新評論