一、定義
責(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)注