您的位置:首页 > 编程语言 > Delphi

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport

2009-11-10 14:47 621 查看
1.主题与观察者

{《HeadFirst设计模式》之观察者模式 }
{ 主题与观察者                    }
{ 编译工具 :Delphi7.0            }
{ 联系方式 :xshlife@163.com      }

unit uWeatherReport;

interface

uses
Classes, SysUtils;

type
TObserver = class; { Forward声明,创建两个相互依赖的类 }

{ 抽象主题 }
TSubject = class(TObject)
procedure RegisterObserver(aObserver: TObserver); virtual; abstract;
procedure RemoveObserver  (aObserver: TObserver); virtual; abstract;
procedure NotifyObserver; virtual; abstract;
end;

{ 具体主题 }
TWeatherData = class(TSubject)
private
FObservers: TList;
FTemp     : Integer;
FHumidity : Integer;
FPresssure: Integer;
public
constructor Create;
destructor Destroy; override;
procedure RegisterObserver(aObserver: TObserver); override;
procedure RemoveObserver  (aObserver: TObserver); override;
procedure NotifyObserver; override;
procedure MeasurementsChanged;
procedure SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
end;

{**************************************************************************}

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

{ 具体观察者 }
TCurrentConditionsDisplay = class(TObserver)
private
FTemp       : Integer;
FHumidity   : Integer;
FWeatherData: TSubject;
public
constructor Create(aWeatherData: TSubject);
destructor Destroy; override;
procedure UpDate(aTemp, aHumidity, aPresssure: Integer); override;
procedure Display; override;
end;

implementation

{ TWeatherData }

constructor TWeatherData.Create;
begin
FObservers := TList.Create;
end;

destructor TWeatherData.Destroy;
begin
FObservers.Clear;
FreeAndNil(FObservers);
inherited Destroy;
end;

procedure TWeatherData.MeasurementsChanged;
begin
NotifyObserver;
end;

procedure TWeatherData.NotifyObserver;
var
i: Integer;
aObserver: TObserver;
begin
for i := 0 to FObservers.Count - 1 do
begin
aObserver := TObserver(FObservers.Items[i]);
aObserver.UpDate(FTemp, FHumidity, FPresssure);
end;
end;

procedure TWeatherData.RegisterObserver(aObserver: TObserver);
begin
FObservers.Add(aObserver);
end;

procedure TWeatherData.RemoveObserver(aObserver: TObserver);
var
i: Integer;
begin
i := FObservers.IndexOf(aObserver);
if (i >= 0) then
FObservers.Remove(aObserver);
end;

procedure TWeatherData.SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
begin
FTemp      := aTemp;
FHumidity  := aHumidity;
FPresssure := aPresssure;
MeasurementsChanged;
end;

{ TCurrentConditionsDisplay }

constructor TCurrentConditionsDisplay.Create(aWeatherData: TSubject);
begin
FWeatherData := aWeatherData;
aWeatherData.RegisterObserver(Self);
end;

destructor TCurrentConditionsDisplay.Destroy;
begin
inherited Destroy;
end;

procedure TCurrentConditionsDisplay.Display;
begin
Writeln('Current Conditions: ', FTemp, ' degrees and ',
FHumidity, '% humidity.');
end;

procedure TCurrentConditionsDisplay.UpDate(aTemp, aHumidity,
aPresssure: Integer);
begin
FTemp     := aTemp;
FHumidity := aHumidity;
Display;
end;

end.


2.客户端

{《HeadFirst设计模式》之观察者模式 }
{ 客户端                         }
{ 编译工具 :Delphi7.0            }
{ 联系方式 :xshlife@163.com       }

program pWeatherReport;

{$APPTYPE CONSOLE}

uses
SysUtils,
uWeatherReport in 'uWeatherReport.pas';

var
aWeatherData: TWeatherData;
aCurrentConditionsDisplay: TCurrentConditionsDisplay;

begin
aWeatherData := TWeatherData.Create;
aCurrentConditionsDisplay := TCurrentConditionsDisplay.Create(aWeatherData);

aWeatherData.SetMeasurements(80, 65, 30);

FreeAndNil(aWeatherData);
FreeAndNil(aCurrentConditionsDisplay);

Readln;
end.


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐