![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
{《HeadFirst设计模式》之观察者模式 }
3
{ 主题与观察者 }
4
{ 编译工具 :Delphi7.0 }
5
{ 联系方式 :guzh-0417@163.com }
6![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
unit uWeatherReport;
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
interface
10![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
uses
12
Classes, SysUtils;
13![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
type
15
TObserver = class; { Forward声明,创建两个相互依赖的类 }
16
17
{ 抽象主题 }
18
TSubject = class(TObject)
19
procedure RegisterObserver(aObserver: TObserver); virtual; abstract;
20
procedure RemoveObserver (aObserver: TObserver); virtual; abstract;
21
procedure NotifyObserver; virtual; abstract;
22
end;
23![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
{ 具体主题 }
25
TWeatherData = class(TSubject)
26
private
27
FObservers: TList;
28
FTemp : Integer;
29
FHumidity : Integer;
30
FPresssure: Integer;
31
public
32
constructor Create;
33
destructor Destroy; override;
34
procedure RegisterObserver(aObserver: TObserver); override;
35
procedure RemoveObserver (aObserver: TObserver); override;
36
procedure NotifyObserver; override;
37
procedure MeasurementsChanged;
38
procedure SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
39
end;
40![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
41
{**************************************************************************}
42![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
43
{ 抽象观察者 }
44
TObserver = class(TObject)
45
procedure UpDate(Temp, Humidity, Presssure: Integer); virtual; abstract;
46
procedure Display; virtual; abstract;
47
end;
48![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
49
{ 具体观察者 }
50
TCurrentConditionsDisplay = class(TObserver)
51
private
52
FTemp : Integer;
53
FHumidity : Integer;
54
FWeatherData: TSubject;
55
public
56
constructor Create(aWeatherData: TSubject);
57
destructor Destroy; override;
58
procedure UpDate(aTemp, aHumidity, aPresssure: Integer); override;
59
procedure Display; override;
60
end;
61![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
62
implementation
63![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
64
{ TWeatherData }
65![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
66
constructor TWeatherData.Create;
67
begin
68
FObservers := TList.Create;
69
end;
70![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
71
destructor TWeatherData.Destroy;
72
begin
73
FObservers.Clear;
74
FreeAndNil(FObservers);
75
inherited Destroy;
76
end;
77![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
78
procedure TWeatherData.MeasurementsChanged;
79
begin
80
NotifyObserver;
81
end;
82![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
83
procedure TWeatherData.NotifyObserver;
84
var
85
i: Integer;
86
aObserver: TObserver;
87
begin
88
for i := 0 to FObservers.Count - 1 do
89
begin
90
aObserver := TObserver(FObservers.Items[i]);
91
aObserver.UpDate(FTemp, FHumidity, FPresssure);
92
end;
93
end;
94![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
95
procedure TWeatherData.RegisterObserver(aObserver: TObserver);
96
begin
97
FObservers.Add(aObserver);
98
end;
99![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
100
procedure TWeatherData.RemoveObserver(aObserver: TObserver);
101
var
102
i: Integer;
103
begin
104
i := FObservers.IndexOf(aObserver);
105
if (i >= 0) then
106
FObservers.Remove(aObserver);
107
end;
108![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
109
procedure TWeatherData.SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
110
begin
111
FTemp := aTemp;
112
FHumidity := aHumidity;
113
FPresssure := aPresssure;
114
MeasurementsChanged;
115
end;
116![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
117
{ TCurrentConditionsDisplay }
118![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
119
constructor TCurrentConditionsDisplay.Create(aWeatherData: TSubject);
120
begin
121
FWeatherData := aWeatherData;
122
aWeatherData.RegisterObserver(Self);
123
end;
124![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
125
destructor TCurrentConditionsDisplay.Destroy;
126
begin
127
inherited Destroy;
128
end;
129![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
130
procedure TCurrentConditionsDisplay.Display;
131
begin
132
Writeln('Current Conditions: ', FTemp, ' degrees and ',
133
FHumidity, '% humidity.');
134
end;
135![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
136
procedure TCurrentConditionsDisplay.UpDate(aTemp, aHumidity,
137
aPresssure: Integer);
138
begin
139
FTemp := aTemp;
140
FHumidity := aHumidity;
141
Display;
142
end;
143![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
144
end.
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
{《HeadFirst设计模式》之观察者模式 }
3
{ 客户端 }
4
{ 编译工具 :Delphi7.0 }
5
{ 联系方式 :guzh-0417@163.com }
6![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
program pWeatherReport;
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
{$APPTYPE CONSOLE}
10![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
uses
12
SysUtils,
13
uWeatherReport in 'uWeatherReport.pas';
14![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
var
16
aWeatherData: TWeatherData;
17
aCurrentConditionsDisplay: TCurrentConditionsDisplay;
18
19
begin
20
aWeatherData := TWeatherData.Create;
21
aCurrentConditionsDisplay := TCurrentConditionsDisplay.Create(aWeatherData);
22![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
aWeatherData.SetMeasurements(80, 65, 30);
24![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
FreeAndNil(aWeatherData);
26
FreeAndNil(aCurrentConditionsDisplay);
27![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
Readln;
29
end.
运行结果:
![](https://images.cnblogs.com/cnblogs_com/delphidesignpatterns/picWeatherReport.JPG)
posted on
2014-11-05 14:37
小光zfg
阅读(
482)
评论()
编辑
收藏
举报