JS設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例詳解
本文實(shí)例講述了JS設(shè)計(jì)模式之責(zé)任鏈模式。分享給大家供大家參考,具體如下:
責(zé)任鏈設(shè)計(jì)模式:
在責(zé)任鏈模式里,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈。請求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對象決定處理此請求。發(fā)出這個(gè)請求的客戶端并不知道鏈上的哪一個(gè)對象最終處理這個(gè)請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。
責(zé)任鏈模式涉及到的角色如下所示:
● 抽象處理者(Handler)角色:定義出一個(gè)處理請求的接口。如果需要,接口可以定義 出一個(gè)方法以設(shè)定和返回對下家的引用。這個(gè)角色通常由一個(gè)Java抽象類或者Java接口實(shí)現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用,抽象方法handleRequest()規(guī)范了子類處理請求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。

在JS(ES6之前)中嚴(yán)格意義上是沒有extends繼承概念,所以以下代碼沒有模擬抽象類,代碼中只實(shí)現(xiàn)了具體處理類.
使用場景:在一個(gè)購物商城,在五一做了一個(gè)活動,所以圖書類商品根據(jù)購買的金額依次做出以下折扣方案,
1、購買滿199元,打9折
2、購買滿399元,打8折
3、購買滿599元以上,打7折;
責(zé)任鏈鏈的優(yōu)點(diǎn):
請求發(fā)送者只需要知道鏈中的第一個(gè)節(jié)點(diǎn),從而弱化了發(fā)送者和一組接收者之間的強(qiáng)聯(lián)系。如果不使用責(zé)任鏈鏈模式、根據(jù)當(dāng)前價(jià)格客戶端要知道每一級打折信息,最后知道具體是那一層上打折才是符合當(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打印出來的效果:

更多關(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é)》
希望本文所述對大家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ì)模式之緩存代理模式原理與簡單用法示例
- 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實(shí)現(xiàn)馬丁策略回測3000只股票的實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)馬丁策略回測3000只股票,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Python調(diào)用服務(wù)接口的實(shí)例
今天小編就為大家分享一篇Python調(diào)用服務(wù)接口的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python中判斷數(shù)字是否為質(zhì)數(shù)的實(shí)例講解
在本篇文章里小編給大家分享了關(guān)于python中判斷數(shù)字是否為質(zhì)數(shù)的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12
使用Python創(chuàng)建一個(gè)文件夾結(jié)構(gòu)生成器
這篇文章主要為大家詳細(xì)介紹了如何使用Python創(chuàng)建一個(gè)文件夾結(jié)構(gòu)生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
Python中關(guān)于面向?qū)ο蟾拍畹脑敿?xì)講解
要了解面向?qū)ο笪覀兛隙ㄐ枰戎缹ο蟮降资鞘裁赐嬉鈨?。關(guān)于對象的理解很簡單,在我們的身邊,每一種事物的存在都是一種對象。總結(jié)為一句話也就是:對象就是事物存在的實(shí)體2021-10-10

