// Based on: https://sourcemaking.com/design_patterns/observer/delphi unit ObserverPattern; interface uses System.Classes; type TSubjectObserver = class(TComponent) private FEnabled: Boolean; FOnChange: TNotifyEvent; protected procedure Change; public constructor Create(AOwner: TComponent);override; published property Enabled: Boolean read FEnabled write FEnabled; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; TSubject = class(TObject) 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(AOwner: TComponent); begin inherited Create(AOwner); self.FEnabled := True; end; procedure TSubjectObserver.Change; begin if Assigned(FOnChange) then FOnChange(self); 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; 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; end; end; procedure TSubject.UnregisterObserver(Observer: TSubjectObserver); begin FObservers.Remove(Observer); end; end.