一、定義
責任鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
二、示例
/* 傳統方式實現 */ // orderType:[1:500, 2:200, 3:普通],isPaid:true/false,stock:庫存量 var order = function(orderType, isPaid, stock) { if(orderType === 1) { if(isPaid) { console.log("500元定金預購,得到100優惠券"); } else { if(stock > 0) { console.log("普通購買,無優惠券"); }else { console.log("庫存不足"); } } }else if(orderType === 2) { if(isPaid) { console.log("200元定金預購,得到50優惠券"); } else { if(stock > 0) { console.log("普通購買,無優惠券"); }else { console.log("庫存不足"); } } }else if(orderType === 2) { if(stock > 0) { console.log("普通購買,無優惠券"); }else { console.log("庫存不足"); } } } order(1, true, 500); /*職責鏈 */ var order500 = function(orderType, isPaid, stock) { if(orderType === 1 && isPaid === true) { console.log("500元定金預購,得到100優惠券"); }else { return "nextSuccessor"; } }; var order200 = function(orderType, isPaid, stock) { if(orderType === 2 && isPaid === true) { console.log("200元定金預購,得到50優惠券"); }else { return "nextSuccessor"; } }; var orderNormal = function(orderType, isPaid, stock) { if(stock > 0) { console.log("普通購買,無優惠券"); }else { console.log("庫存不足"); } }; 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);
優點:解耦了請求發送者和N個接受者之間的復雜關系。
弊端:不能保證某個請求一定會被鏈中的節點處理。
三、示例:文件上傳對象
示例2:用責任鏈模式獲取文件上傳對象
PS:對比《學習JavaScript設計模式之迭代器模式》
function getActiveUploadObj() { try{ return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上傳控件 }catch(e) { return "nextSuccessor"; } } function getFlashUploadObj() { if(supportFlash().f === 1) { // supportFlash見《JavaScript設計模式--迭代器模式》 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());
無論是作用域鏈、原型鏈、還是DOM節點中的事件冒泡,我們都能從中找到職責鏈的影子。
以上就是本文的全部內容,希望本文所述對大家學習javascript程序設計有所幫助。。