-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathmsInvalidators.pas
95 lines (80 loc) · 2.96 KB
/
msInvalidators.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
92
93
94
95
unit msInvalidators;
interface
uses
Generics.Collections,
msInterfaces
;
type
TmsInvalidatorsList = TList<TmsWeakInvalidatorRef>;
// - ïîäïèñ÷èêè - ÂÑÅÃÄÀ - ÑËÀÁÛÅ (https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%B0%D0%B1%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0) ññûëêè
// https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
(*
Íàáëþäàòåëü (àíãë. Observer) — ïîâåäåí÷åñêèé øàáëîí ïðîåêòèðîâàíèÿ. Òàêæå èçâåñòåí êàê «ïîä÷èí¸ííûå» (Dependents), «èçäàòåëü-ïîäïèñ÷èê» (Publisher-Subscriber). Ñîçäàåò ìåõàíèçì ó êëàññà, êîòîðûé ïîçâîëÿåò ïîëó÷àòü ýêçåìïëÿðó îáúåêòà ýòîãî êëàññà îïîâåùåíèÿ îò äðóãèõ îáúåêòîâ îá èçìåíåíèè èõ ñîñòîÿíèÿ, òåì ñàìûì íàáëþäàÿ çà íèìè[2].
*)
TmsInvalidatorLambda = reference to procedure (const anItem: ImsInvalidator);
TmsInvalidators = class
// [Íàáëþäàòåëü (øàáëîí ïðîåêòèðîâàíèÿ)|https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)]
strict private
class var f_Subscribers : TmsInvalidatorsList;
public
class destructor Fini;
private
class procedure DoItems(aLambda: TmsInvalidatorLambda);
public
class procedure InvalidateDiagramm(const aDiagramm: ImsDiagramm);
class procedure DiagrammAdded(const aDiagramms: ImsDiagrammsList; const aDiagramm: ImsDiagramm);
class procedure Subscribe(const anInvalidator: ImsInvalidator);
// - ïîäïèñûâàåìñÿ
class procedure UnSubscribe(const anInvalidator: ImsInvalidator);
// - îòïèñûâàåìñÿ
end;//TmsInvalidators
implementation
uses
SysUtils
;
// TmsInvalidators
class destructor TmsInvalidators.Fini;
begin
FreeAndNil(f_Subscribers);
end;
class procedure TmsInvalidators.DoItems(aLambda: TmsInvalidatorLambda);
var
l_Subscriber : TmsWeakInvalidatorRef;
begin
if (f_Subscribers <> nil) then
for l_Subscriber in f_Subscribers do
aLambda(l_Subscriber);
end;
class procedure TmsInvalidators.InvalidateDiagramm(const aDiagramm: ImsDiagramm);
begin
DoItems(
procedure (const anItem: ImsInvalidator)
begin
anItem.InvalidateDiagramm(aDiagramm)
end
);
end;
class procedure TmsInvalidators.DiagrammAdded(const aDiagramms: ImsDiagrammsList; const aDiagramm: ImsDiagramm);
begin
DoItems(
procedure (const anItem: ImsInvalidator)
begin
anItem.DiagrammAdded(aDiagramms, aDiagramm)
end
);
end;
class procedure TmsInvalidators.Subscribe(const anInvalidator: ImsInvalidator);
// - ïîäïèñûâàåìñÿ
begin
if (f_Subscribers = nil) then
f_Subscribers := TmsInvalidatorsList.Create;
if (f_Subscribers.IndexOf(anInvalidator) < 0) then
f_Subscribers.Add(anInvalidator);
end;
class procedure TmsInvalidators.UnSubscribe(const anInvalidator: ImsInvalidator);
// - îòïèñûâàåìñÿ
begin
if (f_Subscribers <> nil) then
f_Subscribers.Remove(anInvalidator);
end;
end.