-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathBehavioral.ChainOfResponsibility.Pattern.pas
91 lines (70 loc) · 2.02 KB
/
Behavioral.ChainOfResponsibility.Pattern.pas
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
unit Behavioral.ChainOfResponsibility.Pattern;
interface
uses SysUtils;
type
TPurchase = class
public
Number: integer;
Amount: Double;
Purpose: string;
constructor Create(num: integer; am: Double; pur: string);
end;
IApprover = interface
['{3ACA3967-FFCF-48A1-AC45-9A9B98A8DD96}']
procedure SetSuccessor(successor: IApprover);
procedure ProcessRequest(purchase: TPurchase);
end;
TApprover = class(TInterfacedObject, IApprover)
protected
FSuccessor: IApprover;
public
procedure SetSuccessor(successor: IApprover);
procedure ProcessRequest(purchase: TPurchase); virtual; abstract;
end;
TDirector = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;
TVicePresident = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;
TPresident = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;
implementation
{ TApprover }
procedure TApprover.SetSuccessor(successor: IApprover);
begin
FSuccessor := successor;
end;
{ TDirector }
procedure TDirector.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 10000.0 then
WriteLn(Format('Director approved request # %d', [purchase.Number]))
else if FSuccessor <> nil then
FSuccessor.ProcessRequest(purchase);
end;
{ TVicePresident }
procedure TVicePresident.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 25000.0 then
WriteLn(Format('VicePresident approved request # %d', [purchase.Number]))
else if FSuccessor <> nil then
FSuccessor.ProcessRequest(purchase);
end;
{ TPresident }
procedure TPresident.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 100000.0 then
WriteLn(Format('President approved request # %d', [purchase.Number]))
else
WriteLn(Format('Request# %d requires an executive meeting!', [purchase.Number]))
end;
{ TPurchase }
constructor TPurchase.Create(num: integer; am: Double; pur: string);
begin
Number := num;
Amount := am;
Purpose := pur;
end;
end.