白筱汐

想都是问题,做都是答案

0%

JavaScript设计模式——责任链模式

介绍

责任链模式,它允许将请求沿着处理链传递,直到有一个处理者能够处理该请求为止。

主要概念:

  1. 处理者接口(Handle Interface):定义处理接口的请求,通常包含一个处理方法。
  2. 具体处理者(Conreate Handler): 实现处理者接口,负责处理请求,如果自己无法处理,则将请求传递给下一个处理者。
  3. 客户端(Client):创建责任链并向其发送请求。

ts代码

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 定义处理者接口
interface Handler {
setNext(handler: Handler): Handler
handleRequest(amount: number): void
}

// 具体处理者 - CEO
class CEO implements Handler {
private nextHandler: Handler | null

constructor() {
this.nextHandler = null
}

setNext(handler: Handler): Handler {
this.nextHandler = handler
return handler // 链模式
}

handleRequest(amount: number) {
if (amount > 1000) {
console.log('CEO 批准了该购买请求');
} else if (this.nextHandler) {
this.nextHandler.handleRequest(amount)
} else {
console.log('无人处理该购买请求');
}
}
}

// 具体处理者 - VP
class VP implements Handler {
private nextHandler: Handler | null

constructor() {
this.nextHandler = null
}

setNext(handler: Handler): Handler {
this.nextHandler = handler
return handler
}

handleRequest(amount: number) {
if (amount > 500 && amount <= 1000) {
console.log('副总裁批准了该购买请求');
} else if (this.nextHandler) {
this.nextHandler.handleRequest(amount)
} else {
console.log('无人处理该购买请求');
}
}
}

// 具体处理者 - Manager
class Manager implements Handler {
private nextHandler: Handler | null

constructor() {
this.nextHandler = null
}

setNext(handler: Handler): Handler {
this.nextHandler = handler
return handler
}

handleRequest(amount: number) {
if (amount <= 500) {
console.log('经理批准了该购买请求');
} else if (this.nextHandler) {
this.nextHandler.handleRequest(amount);
} else {
console.log('无人处理该购买请求');
}
}
}

// 创建责任链并发送请求
const ceo = new CEO();
const vp = new VP();
const manager = new Manager();

manager.setNext(vp).setNext(ceo);
// vp.setNext(ceo);

manager.handleRequest(300);

manager.handleRequest(800);

manager.handleRequest(1200);