您好,登錄后才能下訂單哦!
本文實(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)求的客戶端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任。
責(zé)任鏈模式涉及到的角色如下所示:
● 抽象處理者(Handler)角色:定義出一個(gè)處理請(qǐng)求的接口。如果需要,接口可以定義 出一個(gè)方法以設(shè)定和返回對(duì)下家的引用。這個(gè)角色通常由一個(gè)Java抽象類或者Java接口實(shí)現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對(duì)下家的引用,抽象方法handleRequest()規(guī)范了子類處理請(qǐng)求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理者可以訪問(wèn)下家。
在JS(ES6之前)中嚴(yán)格意義上是沒(méi)有extends繼承概念,所以以下代碼沒(méi)有模擬抽象類,代碼中只實(shí)現(xiàn)了具體處理類.
使用場(chǎng)景:在一個(gè)購(gòu)物商城,在五一做了一個(gè)活動(dòng),所以圖書(shū)類商品根據(jù)購(gòu)買的金額依次做出以下折扣方案,
1、購(gòu)買滿199元,打9折
2、購(gòu)買滿399元,打8折
3、購(gòu)買滿599元以上,打7折;
責(zé)任鏈鏈的優(yōu)點(diǎn):
請(qǐng)求發(fā)送者只需要知道鏈中的第一個(gè)節(jié)點(diǎn),從而弱化了發(fā)送者和一組接收者之間的強(qiáng)聯(lián)系。如果不使用責(zé)任鏈鏈模式、根據(jù)當(dāng)前價(jià)格客戶端要知道每一級(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; } }
客戶端 :
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)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《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ì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。