Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4ccfd09

Browse files
committed
chain of responsibility pattern
1 parent 2553749 commit 4ccfd09

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

ChainOfResponsibility/chainOfRes.html

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<script>
2+
var order = function(orderType,pay,stock){
3+
if(orderType === 1){ // 500 元定金购买模式
4+
if(pay == true){
5+
console.log('500 元定金预购, 得到100 优惠券');
6+
}else{
7+
if(stock>0){
8+
console.log('普通购买,无优惠券');
9+
}else{
10+
console.log('手机库存不足');
11+
}
12+
}
13+
}
14+
else if(orderType === 2){ // 200 元定金购买模式
15+
if(pay === true){
16+
console.log('200 元定金预购, 得到50 优惠券');
17+
}else{
18+
if(stock>0){
19+
console.log('普通购买,无优惠券');
20+
}else{
21+
console.log('手机库存不足');
22+
}
23+
}
24+
}
25+
else if(orderType === 3){ //普通购买
26+
if(stock > 0){
27+
console.log('普通购买,无优惠券');
28+
}else{
29+
console.log('手机库存不足');
30+
}
31+
}
32+
};
33+
order(1,true,500); // 输出: 500 元定金预购, 得到100 优惠券
34+
</script>
35+
36+
<script>
37+
var order500 = function(orderType,pay,stock){
38+
if(orderType === 1 && pay === true){
39+
console.log('500 元定金预购, 得到100 优惠券');
40+
}else{
41+
order200(orderType,pay,stock);
42+
}
43+
};
44+
45+
// 200 元订单
46+
var order200 = function(orderType,pay,stock){
47+
if(orderType === 2 && pay === true){
48+
console.log('200 元定金预购, 得到50 优惠券');
49+
}else{
50+
orderNormal(orderType,pay,stock);
51+
}
52+
};
53+
54+
// 普通购买订单
55+
var orderNormal = function(orderType,pay,stock){
56+
if(stock > 0){
57+
console.log('普通购买,无优惠券');
58+
}else{
59+
console.log('手机库存不足');
60+
}
61+
};
62+
63+
//测试结果
64+
order500(1,true,500); // 输出:500 元定金预购, 得到100 优惠券
65+
order500(2,true,500); // 输出:200 元定金预购, 得到500 优惠券
66+
order500(3,false,500); // 输出:普通购买, 无优惠券
67+
order500(3,false,0); // 输出:手机库存不足
68+
</script>
69+
70+
<script>
71+
var Order500 = function(orderType,pay,stock){
72+
if(orderType === 1 && pay === true){
73+
console.log('500 元定金预购,得到100 优惠券');
74+
}else{
75+
return 'nextSuccessor';
76+
}
77+
};
78+
79+
var Order200 = function(orderType,pay,stock){
80+
if(orderType === 2 && pay === true){
81+
console.log('200 元定金预购,得到50 优惠券');
82+
}else{
83+
return 'nextSuccessor';
84+
}
85+
};
86+
87+
var OrderNormal = function(orderType,pay,stock){
88+
if(stock > 0){
89+
console.log('普通购买,无优惠券');
90+
}else{
91+
console.log('手机库存不足');
92+
}
93+
};
94+
95+
// Chain.prototype.setNextSuccessor 指定在链中的下一个节点
96+
// Chain.prototype.passRequest 传递请求给某个节点
97+
var Chain = function(fn){
98+
this.fn = fn;
99+
this.successor = null;
100+
};
101+
102+
Chain.prototype.setNextSuccessor = function(successor){
103+
return this.successor = successor;
104+
};
105+
Chain.prototype.passRequest = function(){
106+
var ret = this.fn.apply(this,arguments);
107+
if(ret === 'nextSuccessor'){
108+
return this.successor && this.successor.passRequest.apply(this.successor,arguments);
109+
}
110+
return ret;
111+
};
112+
113+
var chainOrder500 = new Chain(Order500);
114+
var chainOrder200 = new Chain(Order200);
115+
var chainOrderNormal = new Chain(OrderNormal);
116+
117+
chainOrder500.setNextSuccessor(chainOrder200);
118+
chainOrder200.setNextSuccessor(chainOrderNormal);
119+
chainOrder500.passRequest(1,true,500); // 输出:500 元定金预购,得到100 优惠券
120+
chainOrder500.passRequest(2,true,500); // 输出:200 元定金预购,得到50 优惠券
121+
chainOrder500.passRequest(3,true,500); // 输出:普通购买,无优惠券
122+
chainOrder500.passRequest(1,false,0); // 输出:手机库存不足
123+
124+
Function.prototype.after = function(fn){
125+
var self = this;
126+
return function(){
127+
var ret = self.apply(this,arguments);
128+
if(ret === 'nextSuccessor'){
129+
return fn.apply(this,arguments);
130+
}
131+
return ret;
132+
}
133+
};
134+
135+
var order = order500yuan.after(order200yuan).after(OrderNormal);
136+
order(1,true,500); // 输出:500 元定金预购,得到100 优惠券
137+
order(2,true,500); // 输出:200 元定金预购,得到50 优惠券
138+
order(1,false,500); // 输出:普通购买,无优惠券
139+
</script>

0 commit comments

Comments
 (0)