unit Utils.EventBus;
interface
uses
System.Classes;
type
IEventBus = interface(IUnknown)
procedure Notify(information: TObject);
end;
////////////////////////////////////////////////////////////////////////////////
TEventBus = class(TObject)
private
subscribers: TInterfaceList;
public
constructor Create;
destructor Destroy; override;
procedure Attach(subscriber: IEventBus);
procedure Detach(subscriber: IEventBus);
procedure Push(information: TObject);
end;
implementation
constructor TEventBus.Create;
begin
subscribers := TInterfaceList.Create;
end;
destructor TEventBus.Destroy;
begin
subscribers.Free;
subscribers := nil;
inherited Destroy;
end;
procedure TEventBus.Attach(subscriber: IEventBus);
begin
subscribers.Lock;
try
if subscribers.IndexOf(subscriber) < 0 then begin
subscribers.Add(subscriber);
end;
finally
subscribers.Unlock;
end;
end;
procedure TEventBus.Detach(subscriber: IEventBus);
begin
subscribers.Lock;
try
if subscribers.IndexOf(subscriber) > -1 then begin
subscribers.Remove(subscriber);
end;
finally
subscribers.Unlock;
end;
end;
procedure TEventBus.Push(information: TObject);
var
i: Integer;
begin
subscribers.Lock;
try
for i := 0 to subscribers.Count - 1 do begin
IEventBus(subscribers.Items[i]).Notify(information);
end;
finally
subscribers.Unlock;
end;
end;
end.