责任链模式

  • 使多个对象都要机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止
  • 场景: 传统的ifelseswitch 处理动态数据的时候处于强耦合
  • 责任链模式是一对一的。一个对象处理不了就会传递给下一个接受者

代码实现

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
92
93
94
95
96
abstract class Handler {
// 下一个处理者
public successor ?: Handler;
public name : string;
constructor(name : string) {
this.name = name;
}

public abstract handleRequest(request : MyRequest) : void;

public setNext(successor : Handler) : void {
this.successor = successor;
}
}

class ConcreteHandler1 extends Handler {
constructor(name : string) {
super(name);
}

public handleRequest (request : MyRequest) : void {
// 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
if (request.level <= 1) {
console.log('被一级处理');
} else {
// 交给下一级处理
this.successor && this.successor.handleRequest(request);
}
}
}

class ConcreteHandler2 extends Handler {
constructor(name : string) {
super(name);
}

public handleRequest (request : MyRequest) : void {
// 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
if (request.level > 1 && request.level <= 2) {
console.log('被二级处理');
} else {
// 交给下一级处理
this.successor && this.successor.handleRequest(request);
}
}
}

class ConcreteHandler3 extends Handler {
constructor(name : string) {
super(name);
}

public handleRequest (request : MyRequest) : void {
// 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
if (request.level > 2) {
console.log('被三级处理');
} else {
// 交给下一级处理
this.successor && this.successor.handleRequest(request);
}
}
}

class MyRequest {
private _level : number;
constructor(level : number) {
this._level = level;
}

get level() : number {
return this._level;
}

set level(value : number) {
this._level = this.level;
}
}

function main() {
// 创建一个请求
const request : MyRequest = new MyRequest(5);

// 创建相关处理人
const handler1 : Handler = new ConcreteHandler1('lili');
const handler2 : Handler = new ConcreteHandler2('linlin');
const handler3 : Handler = new ConcreteHandler3('shunshun');

// 设置下级别审批,构成环形结构
handler1.setNext(handler2);
handler2.setNext(handler3);
handler3.setNext(handler1);

handler1.handleRequest(request);
}

main();

参考链接