unit uObserver;
{ Zur Nutzung muss der Client:
1. das Interface IdcObserver implementieren
2. die Methode DoOnObserverNotification() bereitstellen und dort
auf das passende Interface prüfen:
if Supports(aInterface, IdcLangMan) then
3. sich als Observer un/registrieren:
Create: RegisterObserver(Self);
Destroy: UnregisterObserver(Self);
Die Notification erfolgt durch Aufruf von
NotifyObserver() mit der Interface-Referenz
}
interface
uses
Classes, SysUtils;
type
IdcObserver =
interface
['
{5308A18A-FE7C-4A60-BB4F-34B2B9F8AAEF}']
procedure DoOnObserverNotification(aInterface : IInterface; aParams : TObject =
nil);
end;
procedure RegisterObserver(aObject : TObject);
procedure UnregisterObserver(aObject : TObject);
procedure NotifyObserver(aInterface : IInterface; aParamObject : TObject =
nil);
implementation
uses
Generics.Collections;
procedure RegisterObserver(aObject : TObject);
procedure UnregisterObserver(aObject : TObject);
procedure NotifyObserver(aInterface : IInterface; aParamObject : TObject =
nil);
{
Die Items sind Referenzen auf die Komponenten, die IdcObserver implementieren.
Items werden benachrichtigt und müssen selbst richtig darauf reagieren (s.o.).
}
TdcObserList = TList<IdcObserver>;
TdcObserverList =
class(TInterfacedObject)
private
FObserverList : TdcObserList;
procedure RegisterObserver(aObserver : IdcObserver);
procedure UnregisterObserver(aObserver : IdcObserver);
procedure NotifyObserver(aInterface : IInterface; aParamObject : TObject =
nil);
public
constructor Create;
destructor Destroy;
override;
end;
var
aObserList : TdcObserverList;
procedure RegisterObserver(aObject : TObject);
var
aObserver : IdcObserver;
begin
if Supports(aObject, IdcObserver, aObserver)
then
aObserList.RegisterObserver(aObserver);
end;
procedure UnregisterObserver(aObject : TObject);
var
aObserver : IdcObserver;
begin
if Supports(aObject, IdcObserver, aObserver)
then
aObserList.UnregisterObserver(aObserver);
end;
procedure NotifyObserver(aInterface : IInterface; aParamObject : TObject =
nil);
begin
aObserList.NotifyObserver(aInterface, aParamObject);
end;
{ TdcObserverList }
constructor TdcObserverList.Create;
begin
FObserverList := TdcObserList.Create;
end;
destructor TdcObserverList.Destroy;
begin
FObserverList.Free;
inherited;
end;
procedure TdcObserverList.NotifyObserver(aInterface : IInterface; aParamObject : TObject =
nil);
var
aObserver : IdcObserver;
begin
for aObserver
in FObserverList
do
aObserver.DoOnObserverNotification(aInterface, aParamObject);
end;
procedure TdcObserverList.RegisterObserver(aObserver: IdcObserver);
begin
FObserverList.Add(aObserver);
end;
procedure TdcObserverList.UnregisterObserver(aObserver: IdcObserver);
begin
FObserverList.Remove(aObserver);
end;
initialization
aObserList := TdcObserverList.Create;
finalization
FreeAndNil(aObserList);
end.