1

2
{《HeadFirst设计模式》之观察者模式 }3
{ 主题与观察者 }4
{ 编译工具 :Delphi7.0 }5
{ 联系方式 :guzh-0417@163.com }6

7
unit uWeatherReport;8

9
interface10

11
uses12
Classes, SysUtils;13

14
type15
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

24
{ 具体主题 }25
TWeatherData = class(TSubject)26
private27
FObservers: TList;28
FTemp : Integer;29
FHumidity : Integer;30
FPresssure: Integer;31
public32
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

41
{**************************************************************************}42

43
{ 抽象观察者 }44
TObserver = class(TObject)45
procedure UpDate(Temp, Humidity, Presssure: Integer); virtual; abstract;46
procedure Display; virtual; abstract;47
end;48

49
{ 具体观察者 }50
TCurrentConditionsDisplay = class(TObserver)51
private52
FTemp : Integer;53
FHumidity : Integer;54
FWeatherData: TSubject;55
public56
constructor Create(aWeatherData: TSubject);57
destructor Destroy; override;58
procedure UpDate(aTemp, aHumidity, aPresssure: Integer); override;59
procedure Display; override;60
end;61

62
implementation63

64
{ TWeatherData }65

66
constructor TWeatherData.Create;67
begin68
FObservers := TList.Create;69
end;70

71
destructor TWeatherData.Destroy;72
begin73
FObservers.Clear;74
FreeAndNil(FObservers);75
inherited Destroy;76
end;77

78
procedure TWeatherData.MeasurementsChanged;79
begin80
NotifyObserver;81
end;82

83
procedure TWeatherData.NotifyObserver;84
var85
i: Integer;86
aObserver: TObserver;87
begin88
for i := 0 to FObservers.Count - 1 do89
begin90
aObserver := TObserver(FObservers.Items[i]);91
aObserver.UpDate(FTemp, FHumidity, FPresssure);92
end;93
end;94

95
procedure TWeatherData.RegisterObserver(aObserver: TObserver);96
begin97
FObservers.Add(aObserver);98
end;99

100
procedure TWeatherData.RemoveObserver(aObserver: TObserver);101
var102
i: Integer;103
begin104
i := FObservers.IndexOf(aObserver);105
if (i >= 0) then106
FObservers.Remove(aObserver);107
end;108

109
procedure TWeatherData.SetMeasurements(aTemp, aHumidity, aPresssure: Integer);110
begin111
FTemp := aTemp;112
FHumidity := aHumidity;113
FPresssure := aPresssure;114
MeasurementsChanged;115
end;116

117
{ TCurrentConditionsDisplay }118

119
constructor TCurrentConditionsDisplay.Create(aWeatherData: TSubject);120
begin121
FWeatherData := aWeatherData;122
aWeatherData.RegisterObserver(Self);123
end;124

125
destructor TCurrentConditionsDisplay.Destroy;126
begin127
inherited Destroy;128
end;129

130
procedure TCurrentConditionsDisplay.Display;131
begin132
Writeln('Current Conditions: ', FTemp, ' degrees and ',133
FHumidity, '% humidity.');134
end;135

136
procedure TCurrentConditionsDisplay.UpDate(aTemp, aHumidity,137
aPresssure: Integer);138
begin139
FTemp := aTemp;140
FHumidity := aHumidity;141
Display;142
end;143

144
end.
1

2
{《HeadFirst设计模式》之观察者模式 }3
{ 客户端 }4
{ 编译工具 :Delphi7.0 }5
{ 联系方式 :guzh-0417@163.com }6

7
program pWeatherReport;8

9
{$APPTYPE CONSOLE}10

11
uses12
SysUtils,13
uWeatherReport in 'uWeatherReport.pas';14

15
var16
aWeatherData: TWeatherData;17
aCurrentConditionsDisplay: TCurrentConditionsDisplay;18
19
begin20
aWeatherData := TWeatherData.Create;21
aCurrentConditionsDisplay := TCurrentConditionsDisplay.Create(aWeatherData);22

23
aWeatherData.SetMeasurements(80, 65, 30);24

25
FreeAndNil(aWeatherData);26
FreeAndNil(aCurrentConditionsDisplay);27

28
Readln;29
end.
运行结果:
浙公网安备 33010602011771号