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. 运行结果: