一、定義
責(zé)任鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系,將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。
二、示例
/* 傳統(tǒng)方式實(shí)現(xiàn) */// orderType:[1:500, 2:200, 3:普通],isPaid:true/false,stock:庫(kù)存量var order = function(orderType, isPaid, stock) {  if(orderType === 1) {    if(isPaid) {      console.log("500元定金預(yù)購(gòu),得到100優(yōu)惠券");    } else {      if(stock > 0) {        console.log("普通購(gòu)買,無(wú)優(yōu)惠券");      }else {        console.log("庫(kù)存不足");      }    }  }else if(orderType === 2) {    if(isPaid) {      console.log("200元定金預(yù)購(gòu),得到50優(yōu)惠券");    } else {      if(stock > 0) {        console.log("普通購(gòu)買,無(wú)優(yōu)惠券");      }else {        console.log("庫(kù)存不足");      }    }  }else if(orderType === 2) {    if(stock > 0) {      console.log("普通購(gòu)買,無(wú)優(yōu)惠券");    }else {      console.log("庫(kù)存不足");    }  }}order(1, true, 500);/*職責(zé)鏈 */var order500 = function(orderType, isPaid, stock) {  if(orderType === 1 && isPaid === true) {    console.log("500元定金預(yù)購(gòu),得到100優(yōu)惠券");  }else {    return "nextSuccessor";  }};var order200 = function(orderType, isPaid, stock) {  if(orderType === 2 && isPaid === true) {    console.log("200元定金預(yù)購(gòu),得到50優(yōu)惠券");  }else {    return "nextSuccessor";  }};var orderNormal = function(orderType, isPaid, stock) {  if(stock > 0) {    console.log("普通購(gòu)買,無(wú)優(yōu)惠券");  }else {    console.log("庫(kù)存不足");  }};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 order = order500.after(order200).after(orderNormal);order(1, true, 10);優(yōu)點(diǎn):解耦了請(qǐng)求發(fā)送者和N個(gè)接受者之間的復(fù)雜關(guān)系。 
弊端:不能保證某個(gè)請(qǐng)求一定會(huì)被鏈中的節(jié)點(diǎn)處理。
三、示例:文件上傳對(duì)象
示例2:用責(zé)任鏈模式獲取文件上傳對(duì)象 
PS:對(duì)比《學(xué)習(xí)JavaScript設(shè)計(jì)模式之迭代器模式》
function getActiveUploadObj() {  try{    return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上傳控件  }catch(e) {    return "nextSuccessor";  }}function getFlashUploadObj() {  if(supportFlash().f === 1) {  // supportFlash見《JavaScript設(shè)計(jì)模式--迭代器模式》    var str = '<object type="application/x-shockwave-flash"></object>';    return $(str).appendTo($("body"));  }  return "nextSuccessor";}function getFormUploadObj() {  var str = '<input name="file" type="file" class="ui-file" />';  return $(str).appendTo($("body"));}var getUploadObj = getActiveUploadObj.after(getFlashUploadObj).after(getFormUploadObj);console.log(getUploadObj());無(wú)論是作用域鏈、原型鏈、還是DOM節(jié)點(diǎn)中的事件冒泡,我們都能從中找到職責(zé)鏈的影子。
以上就是本文的全部?jī)?nèi)容,希望本文所述對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注