职责链的定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

在以下场景中可以考虑使用责任链模式

  1. 一个系统的审批需要多个对象才能完成处理的情况下,例如报销系统等。
  2. 代码中存在多个 if-else 语句的情况下,此时可以考虑使用责任链模式来对代码进行重构。

代码例子

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
export class Stack {
next: any = null;
fn: Function | any = null;
constructor(fn: Function) {
this.fn = fn;
}
setNextStack = (stack: any) => {
this.next = stack;
};
passRequest = (...args: any[]) => {
const [status, ret] = this.fn(...args);
if (typeof status === "boolean" && status) {
if (this.next) {
if (Array.isArray(ret)) {
this.next.passRequest(...ret);
} else {
this.next.passRequest(ret);
}
}
}
return ret;
};
}

---------------------

function coupon100(pay: number, num: number) {
if (pay * num > 100) {
console.log(`已经优惠了100,实付${pay * num - 100}`);
return [false, `已经优惠了100,实付${pay * num - 100}`];
} else {
return [true, [pay, num]];
}
}

function coupon50(pay: number, num: number) {
if (pay * num > 50) {
console.log(`已经优惠了50,实付${pay * num - 50}`);
return [false, `已经优惠了50,实付${pay * num - 50}`];
} else {
return [true, [pay, num]];
}
}

function coupon200(pay: number, num: number) {
if (pay * num > 200) {
console.log(`已经优惠了200,实付${pay * num - 200}`);
return [false, `已经优惠了200,实付${pay * num - 200}`];
} else {
return [true, [pay, num]];
}
}

const stack200 = new Stack(coupon200);
const stack100 = new Stack(coupon100);
const stack50 = new Stack(coupon50);

stack200.setNextStack(stack100);
stack100.setNextStack(stack50);

stack200.passRequest(43, 2);