學(xué)習(xí)JavaScript設(shè)計模式之責(zé)任鏈模式
一、定義
責(zé)任鏈模式:使多個對象都有機(jī)會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
二、示例
- 假設(shè)這么一個場景:
- 我們負(fù)責(zé)一個售賣手機(jī)的電商網(wǎng)站,經(jīng)過分別繳納500元定金和200元定金的兩輪預(yù)定后,到了正式購買階段。針對預(yù)定用戶實行優(yōu)惠,支付過500元定金的用戶會收到100元的商城優(yōu)惠券,支付過200元定金的用戶會收到50元的商城優(yōu)惠券,沒有支付定金的用戶歸為普通購買,且在庫存有限的情況下不一定保證買到。
/* 傳統(tǒng)方式實現(xiàn) */ // orderType:[1:500, 2:200, 3:普通],isPaid:true/false,stock:庫存量 var order = function(orderType, isPaid, stock) { if(orderType === 1) { if(isPaid) { console.log("500元定金預(yù)購,得到100優(yōu)惠券"); } else { if(stock > 0) { console.log("普通購買,無優(yōu)惠券"); }else { console.log("庫存不足"); } } }else if(orderType === 2) { if(isPaid) { console.log("200元定金預(yù)購,得到50優(yōu)惠券"); } else { if(stock > 0) { console.log("普通購買,無優(yōu)惠券"); }else { console.log("庫存不足"); } } }else if(orderType === 2) { if(stock > 0) { console.log("普通購買,無優(yōu)惠券"); }else { console.log("庫存不足"); } } } order(1, true, 500); /*職責(zé)鏈 */ var order500 = function(orderType, isPaid, stock) { if(orderType === 1 && isPaid === true) { console.log("500元定金預(yù)購,得到100優(yōu)惠券"); }else { return "nextSuccessor"; } }; var order200 = function(orderType, isPaid, stock) { if(orderType === 2 && isPaid === true) { console.log("200元定金預(yù)購,得到50優(yōu)惠券"); }else { return "nextSuccessor"; } }; var orderNormal = function(orderType, isPaid, stock) { if(stock > 0) { console.log("普通購買,無優(yōu)惠券"); }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);
優(yōu)點:解耦了請求發(fā)送者和N個接受者之間的復(fù)雜關(guān)系。
弊端:不能保證某個請求一定會被鏈中的節(jié)點處理。
三、示例:文件上傳對象
示例2:用責(zé)任鏈模式獲取文件上傳對象
PS:對比《學(xué)習(xí)JavaScript設(shè)計模式之迭代器模式》
function getActiveUploadObj() { try{ return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上傳控件 }catch(e) { return "nextSuccessor"; } } function getFlashUploadObj() { if(supportFlash().f === 1) { // supportFlash見《JavaScript設(shè)計模式--迭代器模式》 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節(jié)點中的事件冒泡,我們都能從中找到職責(zé)鏈的影子。
以上就是本文的全部內(nèi)容,希望本文所述對大家學(xué)習(xí)javascript程序設(shè)計有所幫助。。
- JS設(shè)計模式之責(zé)任鏈模式實例詳解
- JavaScript設(shè)計模式之代理模式實例分析
- JavaScript設(shè)計模式之職責(zé)鏈模式應(yīng)用示例
- JavaScript設(shè)計模式之模板方法模式原理與用法示例
- JavaScript設(shè)計模式之緩存代理模式原理與簡單用法示例
- JavaScript設(shè)計模式之觀察者模式(發(fā)布訂閱模式)原理與實現(xiàn)方法示例
- JavaScript設(shè)計模式之工廠模式和抽象工廠模式定義與用法分析
- JavaScript設(shè)計模式之構(gòu)造器模式(生成器模式)定義與用法實例分析
- JavaScript設(shè)計模式之原型模式分析【ES5與ES6】
- JavaScript設(shè)計模式之責(zé)任鏈模式實例分析
相關(guān)文章
js跨瀏覽器實現(xiàn)將字符串轉(zhuǎn)化為xml對象的方法
將字符串轉(zhuǎn)化為xml對象需要注意的是該死的ie多版本的問題,具體實現(xiàn)如下,感興趣的朋友不妨參考下本文,希望對大家有所幫助2013-09-09JS消息彈框alert、confirm、prompt的實現(xiàn)代碼
這篇文章主要介紹了JS消息彈框alert、confirm、prompt,文中還給大家介紹了js的三大基礎(chǔ)彈框,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09