JS設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例詳解
本文實(shí)例講述了JS設(shè)計(jì)模式之責(zé)任鏈模式。分享給大家供大家參考,具體如下:
責(zé)任鏈設(shè)計(jì)模式:
在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求。發(fā)出這個(gè)請(qǐng)求的客戶(hù)端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶(hù)端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任。
責(zé)任鏈模式涉及到的角色如下所示:
● 抽象處理者(Handler)角色:定義出一個(gè)處理請(qǐng)求的接口。如果需要,接口可以定義 出一個(gè)方法以設(shè)定和返回對(duì)下家的引用。這個(gè)角色通常由一個(gè)Java抽象類(lèi)或者Java接口實(shí)現(xiàn)。上圖中Handler類(lèi)的聚合關(guān)系給出了具體子類(lèi)對(duì)下家的引用,抽象方法handleRequest()規(guī)范了子類(lèi)處理請(qǐng)求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理者可以訪問(wèn)下家。
在JS(ES6之前)中嚴(yán)格意義上是沒(méi)有extends繼承概念,所以以下代碼沒(méi)有模擬抽象類(lèi),代碼中只實(shí)現(xiàn)了具體處理類(lèi).
使用場(chǎng)景:在一個(gè)購(gòu)物商城,在五一做了一個(gè)活動(dòng),所以圖書(shū)類(lèi)商品根據(jù)購(gòu)買(mǎi)的金額依次做出以下折扣方案,
1、購(gòu)買(mǎi)滿(mǎn)199元,打9折
2、購(gòu)買(mǎi)滿(mǎn)399元,打8折
3、購(gòu)買(mǎi)滿(mǎn)599元以上,打7折;
責(zé)任鏈鏈的優(yōu)點(diǎn):
請(qǐng)求發(fā)送者只需要知道鏈中的第一個(gè)節(jié)點(diǎn),從而弱化了發(fā)送者和一組接收者之間的強(qiáng)聯(lián)系。如果不使用責(zé)任鏈鏈模式、根據(jù)當(dāng)前價(jià)格客戶(hù)端要知道每一級(jí)打折信息,最后知道具體是那一層上打折才是符合當(dāng)前價(jià)格的折扣。
function BookHandler() { this.calcPrice = function( price ) { if ( 199 > price ) { console.log("原價(jià)是:"+ price); } else { this.successor.calcPrice( price ); } } this.setSuccessor = function( _successor ) { this.successor = _successor; } } function BookCalc9Handler( _successor ) { this.calcPrice = function( price ) { if ( 199 <= price && price < 399 ) { console.log("原價(jià)是:"+ price +";打9折后:" + (price * 0.9)); } else { this.successor.calcPrice( price ); } } this.setSuccessor = function( _successor ) { this.successor = _successor; } } function BookCalc8Handler() { this.calcPrice = function( price ) { if ( 399 <= price && price < 599 ) { console.log("原價(jià)是:"+ price +";打8折后:" + (price * 0.8)); } else { this.successor.calcPrice( price ) } } this.setSuccessor = function( _successor ) { this.successor = _successor; } } function BookCalc7Handler() { this.calcPrice = function( price ) { if ( price >= 599 ) { console.log("原價(jià)是:"+ price +";打7折后:" + (price * 0.7)); } else { this.successor.calcPrice( price ) } } this.setSuccessor = function( _successor ) { this.successor = _successor; } }
客戶(hù)端 :
var price = 400; var bookHandler = new BookHandler(); var bookCalc9Handler = new BookCalc9Handler(); var bookCalc8Handler = new BookCalc8Handler(); var bookCalc7Handler = new BookCalc7Handler(); bookHandler.setSuccessor(bookCalc9Handler); bookCalc9Handler.setSuccessor(bookCalc8Handler); bookCalc8Handler.setSuccessor(bookCalc7Handler); bookHandler.calcPrice(price);
Console.log打印出來(lái)的效果:
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之責(zé)任鏈模式
- 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)文章
Python中正則表達(dá)式妙用之以搜索電子郵件地址為例
這篇文章主要給大家介紹了關(guān)于Python中正則表達(dá)式妙用之以搜索電子郵件地址為例的相關(guān)資料,正則表達(dá)式經(jīng)常被用到,而自己總是記不全,匯總一份完整的以備不時(shí)之需,需要的朋友可以參考下2024-05-05python3實(shí)現(xiàn)windows下同名進(jìn)程監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)windows下同名進(jìn)程監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06對(duì)于Python異常處理慎用“except:pass”建議
這篇文章主要介紹了對(duì)于Python異常處理方法的建議,摘選自StackOverflow上的熱門(mén)問(wèn)題的回答,闡述了except:pass的使用時(shí)需要注意的地方,需要的朋友可以參考下2015-04-04Django配置跨域并開(kāi)發(fā)測(cè)試接口
這篇文章主要介紹了Django配置跨域并開(kāi)發(fā)測(cè)試接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python wxpython模塊響應(yīng)鼠標(biāo)拖動(dòng)事件操作示例
這篇文章主要介紹了Python wxpython模塊響應(yīng)鼠標(biāo)拖動(dòng)事件操作,結(jié)合實(shí)例形式分析了Python使用wxpython模塊創(chuàng)建窗口、綁定事件及相應(yīng)鼠標(biāo)事件相關(guān)操作技巧,需要的朋友可以參考下2018-08-08