Chain Of Responsibility Design Pattern (javascript)

使用情境

Chain Of Responsibility 主要用在順序可能會變換,甚至不確定要執行全部的步驟或只有部分的步驟。你會非常常見到它或許名稱不同,pipeline 或 middleware,都具有到這樣的概念。

案例

在這個例子,主要是針對具有很多種類的促銷方案,你同時有多種折扣,你希望它的計算順序可以很輕易的更變。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var DiscountService = {
order: null,
init:function (order) {
this.order = order;
return this;
},
// 特定分類折扣
dptDiscount:function () {
this.order.price = Math.round(this.order.price * 0.9);
return this;
},
// 滿額折扣
bigOrderDiscount:function () {
if(this.order.price > 6000){
this.order.price -= 100;
}
return this;
},
// VIP 折扣
vip:function () {
if(this.order.isVip){
this.order.price = Math.round(this.order.price * 0.95);
}
return this;
}
};

module.exports = DiscountService;

進入點

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var DiscountService = require('./DiscountService.js');

var order = {
isVip: true,
price: 1000
}

var result = DiscountService.init(order).dptDiscount().bigOrderDiscount().vip();
console.log('price is $', result.order.price);

var order2 = {
isVip: true,
price: 6600
}

var result2 = DiscountService.init(order2).dptDiscount().bigOrderDiscount().vip();
console.log('price is $', result2.order.price);

var result3 = DiscountService.init(order2).dptDiscount().vip().bigOrderDiscount();
console.log('price is $', result3.order.price);


var result4 = DiscountService.init(order2).dptDiscount().vip();
console.log('price is $', result4.order.price);