學(xué)習(xí)JavaScript設(shè)計(jì)模式之責(zé)任鏈模式
一、定義
責(zé)任鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系,將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。
二、示例
- 假設(shè)這么一個(gè)場(chǎng)景:
- 我們負(fù)責(zé)一個(gè)售賣手機(jī)的電商網(wǎng)站,經(jīng)過分別繳納500元定金和200元定金的兩輪預(yù)定后,到了正式購(gòu)買階段。針對(duì)預(yù)定用戶實(shí)行優(yōu)惠,支付過500元定金的用戶會(huì)收到100元的商城優(yōu)惠券,支付過200元定金的用戶會(huì)收到50元的商城優(yōu)惠券,沒有支付定金的用戶歸為普通購(gòu)買,且在庫(kù)存有限的情況下不一定保證買到。
/* 傳統(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)買,無優(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)買,無優(yōu)惠券");
}else {
console.log("庫(kù)存不足");
}
}
}else if(orderType === 2) {
if(stock > 0) {
console.log("普通購(gòu)買,無優(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)買,無優(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());
無論是作用域鏈、原型鏈、還是DOM節(jié)點(diǎn)中的事件冒泡,我們都能從中找到職責(zé)鏈的影子。
以上就是本文的全部?jī)?nèi)容,希望本文所述對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。。
- JS設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例詳解
- JavaScript設(shè)計(jì)模式之代理模式實(shí)例分析
- JavaScript設(shè)計(jì)模式之職責(zé)鏈模式應(yīng)用示例
- JavaScript設(shè)計(jì)模式之模板方法模式原理與用法示例
- JavaScript設(shè)計(jì)模式之緩存代理模式原理與簡(jiǎn)單用法示例
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
- JavaScript設(shè)計(jì)模式之工廠模式和抽象工廠模式定義與用法分析
- JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之原型模式分析【ES5與ES6】
- JavaScript設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例分析
相關(guān)文章
js實(shí)現(xiàn)購(gòu)物網(wǎng)站放大鏡功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)購(gòu)物網(wǎng)站放大鏡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
el-select數(shù)據(jù)過多懶加載的解決(loadmore)
這篇文章主要介紹了el-select數(shù)據(jù)過多懶加載的解決(loadmore),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
javascript之分片上傳,斷點(diǎn)續(xù)傳的實(shí)際項(xiàng)目實(shí)現(xiàn)詳解
在本篇文章里小編給大家整理了關(guān)于javascript之分片上傳,斷點(diǎn)續(xù)傳的實(shí)際項(xiàng)目實(shí)現(xiàn)的詳細(xì)內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-09-09
Js 代碼中,ajax請(qǐng)求地址后加隨機(jī)數(shù)防止瀏覽器緩存的原因
Js 代碼中,ajax請(qǐng)求地址后加隨機(jī)數(shù)防止瀏覽器緩存的原因,需要的朋友可以參考一下2013-05-05
小程序使用watch監(jiān)聽數(shù)據(jù)變化的方法詳解
這篇文章主要介紹了小程序使用watch監(jiān)聽數(shù)據(jù)變化的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
JavaScript指定斷點(diǎn)操作實(shí)例教程
這篇文章主要給大家介紹了關(guān)于JavaScript指定斷點(diǎn)操作的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
關(guān)于function類中定義變量this的簡(jiǎn)單說明
下面小編就為大家?guī)硪黄P(guān)于function類中定義變量this的簡(jiǎn)單說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
[js高手之路]設(shè)計(jì)模式系列課程-發(fā)布者,訂閱者重構(gòu)購(gòu)物車的實(shí)例
下面小編就為大家?guī)硪黄猍js高手之路]設(shè)計(jì)模式系列課程-發(fā)布者,訂閱者重構(gòu)購(gòu)物車的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
詳解使用fetch發(fā)送post請(qǐng)求時(shí)的參數(shù)處理
這篇文章主要介紹了詳解使用fetch發(fā)送post請(qǐng)求時(shí)的參數(shù)處理的相關(guān)資料,需要的朋友可以參考下2017-04-04
JavaScript中利用構(gòu)造器函數(shù)模擬類的方法
JavaScript中沒有類的概念,所以其在對(duì)象創(chuàng)建方面與面向?qū)ο笳Z言有所不同。這篇文章主要介紹了JavaScript中利用構(gòu)造器函數(shù)模擬類的方法,文中給出了詳細(xì)的示例代碼和介紹,需要的朋友可以參考下,下面一起看看吧。2017-02-02

