Skip to content

Instantly share code, notes, and snippets.

@dipold
Last active May 20, 2016 19:00
Show Gist options
  • Save dipold/ceb079d1b1e78f3edcda6214cf970251 to your computer and use it in GitHub Desktop.
Save dipold/ceb079d1b1e78f3edcda6214cf970251 to your computer and use it in GitHub Desktop.
Observer pattern using anonymous methods
type
IObservable<T> = interface(IInterface)
['{C783F241-8BC8-401E-9666-D4DCE08A711B}']
procedure NotifyAll(const AValue: T);
procedure Register(const AObserver: TProc<T>);
procedure Unregister(const AObserver: TProc<T>);
procedure UnregisterAll;
end;
TObservable<T> = class sealed(TInterfacedObject, IObservable<T>)
strict private
FObservers: TArray<TProc<T>>;
public
procedure NotifyAll(const AValue: T);
procedure Register(const AObserver: TProc<T>);
procedure Unregister(const AObserver: TProc<T>);
procedure UnregisterAll;
end;
implementation
{ TObservable }
procedure TObservable<T>.NotifyAll(const AValue: T);
var
Observer: TProc<T>;
begin
for Observer in FObservers do
Observer(AValue);
end;
procedure TObservable<T>.Register(const AObserver: TProc<T>);
begin
TArray.Add<TProc<T>>(FObservers, AObserver);
TArray.Sort<TProc<T>>(FObservers);
end;
procedure TObservable<T>.Unregister(const AObserver: TProc<T>);
begin
TArray.Remove<TProc<T>>(FObservers, AObserver);
end;
procedure TObservable<T>.UnregisterAll;
var
Observer: TProc<T>;
begin
for Observer in FObservers do
Unregister(Observer);
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment