// Based on: https://sourcemaking.com/design_patterns/observer/delphi unit ObserverPattern; interface uses System.Classes; type TSubjectObserver = class private FEnabled: Boolean; FOnChange: TNotifyEvent; protected procedure Change(Subject: TObject); public constructor Create(); property Enabled: Boolean read FEnabled write FEnabled; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; TSubject = class private FObservers: TList; protected procedure Change; // Call this method to dispatch change public constructor Create(); procedure RegisterObserver(Observer: TSubjectObserver); procedure UnregisterObserver(Observer: TSubjectObserver); end; implementation constructor TSubjectObserver.Create(); begin inherited Create(); self.FEnabled := True; end; procedure TSubjectObserver.Change(Subject: TObject); begin if Assigned(FOnChange) then FOnChange(Subject); end; constructor TSubject.Create(); begin inherited Create(); FObservers := TList.Create(); end; procedure TSubject.Change; var Obs: TSubjectObserver; I: Integer; begin for I := 0 to FObservers.Count - 1 do begin Obs := FObservers[I]; if Obs.Enabled then Obs.Change(self); end; end; procedure TSubject.RegisterObserver(Observer: TSubjectObserver); begin if FObservers.IndexOf(Observer) = -1 then begin FObservers.Add(Observer); // Update nieuwe observer if Observer.Enabled then Observer.Change(self); end; end; procedure TSubject.UnregisterObserver(Observer: TSubjectObserver); begin FObservers.Remove(Observer); end; end.