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) protected procedure RecibirAviso(ASujeto: ISujeto); overload; virtual; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); overload; virtual; abstract; end; TSujeto = class(TInterfacedObject, ISujeto) private fObservadores: IInterfaceList; 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; IControllerBase = IObservador; TControllerBase = TObservador; 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 inherited; FObservadores := TInterfaceList.Create; end; procedure TSujeto.DeleteObservador(Observador: IObservador); begin FObservadores.Remove(Observador); end; destructor TSujeto.Destroy; begin FObservadores := NIL; inherited; end; { TObservador } procedure TObservador.RecibirAviso(ASujeto: ISujeto); begin // end; end.