职责链的定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在以下场景中可以考虑使用责任链模式
- 一个系统的审批需要多个对象才能完成处理的情况下,例如报销系统等。
- 代码中存在多个 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);
|
最后更新时间: