责任链模式
定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
引自:菜鸟教程
从上面的话中我们可以得出两个结论。首先责任链模式让请求者无感,它只需要担心结果即可。其次针对一个请求的处理是由一条链来组成的,这个链上的每个节点都明确的具有自己的权限范围,当无法处理时将请求传递给下一个节点。如果还是不太理解请看下图,一图胜千言
我忘了这种图叫什么图了,也不知道用的图形是否正确,但是责任链模式的含义大致如此
# 代码实现
代码编写最核心的是接口的设计,需要将处理请求的功能形成一个链,主要由两部分组成
- 定义一个处理请求的接口。
- 实现后继链。
大致类图如下
program ChainOfResponsibility;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
THandle = class abstract
private
FNextHandle: THandle;
public
property NextHandle: THandle read FNextHandle write FNextHandle;
procedure RequestHandle(Request: Integer); virtual; abstract;
end;
TLeader = class(THandle)
public
procedure RequestHandle(Request: Integer); override;
end;
TManager = class(THandle)
procedure RequestHandle(Request: Integer); override;
end;
{ TLeader }
procedure TLeader.RequestHandle(Request: Integer);
begin
if (Request >= 1) and (Request <= 3) then Writeln('组长审批通过')
else NextHandle.RequestHandle(Request) // 当前领导无法处理,交由上级
end;
{ TManager }
procedure TManager.RequestHandle(Request: Integer);
begin
if (Request >= 4) and (Request <= 10) then Writeln('项目经理审批通过')
else NextHandle.RequestHandle(Request)
end;
begin
try
// 组装链
var
Manager := TManager.Create();
var
Leader := TLeader.Create();
Leader.NextHandle := Manager;
// 发起请求
Leader.RequestHandle(10);
except
on E: Exception do Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
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
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