Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport
2009-11-10 14:47
621 查看
1.主题与观察者
2.客户端
运行结果:
{《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.
运行结果:
相关文章推荐
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---门面模式之HomeTheater
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteControlTest
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---单例模式之ChocolateBoiler
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子
- 设计模式:观察者模式(有利于代码解耦)
- 游戏设计模式系列(二)—— 适时使用观察者模式,解耦你的代码
- 设计模式:观察者模式(有利于代码解耦)
- c++实现设计模式中的观察者模式,削除代码的if else switch