unit uControllerBase;

interface

uses
  Classes, uDADataTable;

type
  ISujeto = interface;

  IObservador = interface
  ['{679D5CF2-D5DC-4A52-9FF3-04AD91402483}']
    procedure RecibirAviso(ASujeto: ISujeto); overload;
    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); overload;
  end;

  ISujeto = interface
  ['{CDB691CD-D1D6-4F2E-AA34-93B1CD0E6030}']
    procedure AddObservador(Observador: IObservador);
    procedure DeleteObservador(Observador: IObservador);
  end;

  TObservador = class(TInterfacedObject, IObservador)
  public
    procedure RecibirAviso(ASujeto: ISujeto); overload; virtual;
    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); overload; virtual; abstract;
  end;

  TSujeto = class(TInterfacedObject, ISujeto)
  private
    fObservadores: IInterfaceList;
    fUpdateCount: Integer;
  protected
    procedure AvisarObservadores; overload;
    procedure AvisarObservadores(ADataTable: IDAStronglyTypedDataTable); overload;
  public
    constructor Create; virtual;
    procedure AddObservador(Observador: IObservador);
    procedure DeleteObservador(Observador: IObservador);
    destructor Destroy; override;
  end;

implementation

uses
  SysUtils;

{ TSujeto }

procedure TSujeto.addObservador(Observador: IObservador);
begin
  fObservadores.Add(Observador);
end;

procedure TSujeto.AvisarObservadores;
var
  i: Integer;
  AObs : IObservador;
begin
  for i := 0 to Pred(fObservadores.Count) do
  begin
     if Supports(fObservadores[i], IObservador, AObs) then
        AObs.RecibirAviso(Self);
  end;
end;

procedure TSujeto.AvisarObservadores(ADataTable: IDAStronglyTypedDataTable);
var
  i: Integer;
  AObs : IObservador;
begin
  for i := 0 to Pred(fObservadores.Count) do
  begin
     if Supports(fObservadores[i], IObservador, AObs) then
        AObs.RecibirAviso(Self, ADataTable);
  end;
end;

constructor TSujeto.Create;
begin
  fObservadores := TInterfaceList.Create;
end;

procedure TSujeto.DeleteObservador(Observador: IObservador);
begin
  fObservadores.Remove(Observador);
end;

destructor TSujeto.Destroy;
begin
  FreeAndNil(fObservadores);
  inherited;
end;

{ TObservador }

procedure TObservador.RecibirAviso(ASujeto: ISujeto);
begin
  //
end;

end.
