我希望使用Delphi实现观察者模式。
这里有一个接口ISubject
和一个实现观察者的类TWeatherData
。
ISubject = interface
procedure notifyObservers;
procedure removeObserver(o: IObserver);
procedure registerObserver(o: IObserver);
end;
TWeatherData = class(TInterfacedObject, ISubject)
private
observers: TList;
FTemperature: Double;
FHumidity: Double;
FPressure: Double;
public
// ...
procedure notifyObservers;
procedure setMeasurements(ATemperature, AHumidity, APressure: Double);
end;
当执行TWeatherData.notifyObservers
时,我遇到了一个关于读取地址的访问冲突
procedure TWeatherData.notifyObservers;
var
observer: ^IObserver;
begin
for observer in observers do
observer.Update(FTemperature, FHumidity, FPressure); //oops -> there raised AV.
end;
procedure TWeatherData.setMeasurements(ATemperature, AHumidity,
APressure: Double);
begin
measurementsChanged; // and this one calls TWeatherData.notifyObservers;
end;
主程序如下:
weatherStation := TWeatherData.Create;
currentConditionalDisplay := TCurrentConditionalDisplay.Create(weatherStation);
weatherStation.setMeasurements(100.0, 58.0, 756.0); // a stack head of exception.