Ver Mensaje Individual
  #2  
Antiguo 21-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El patrón del observador consiste de un sujeto a observar (subject) y varios objetos que lo observan (observers). La idea es que cada cambio en el sujeto se notifica a los observadores que tenga conectados. Un ejemplo lo da un DataSet. Cada cambio en algún registro, se notifica a todos los controles dbaware conectados a él através de un DataSource

Como en todo patrón de diseño, puede haber muchas formas de implementarlo, pero la idea básica sería así:

Código Delphi [-]
type
  TObserver = class;

  TSubject = class
  public
    procedure Attach(Observer: TObserver); virtual; abstract;
    procedure Detach(Observer: TObserver); virtual; abstract;

    procedure Notify; virtual; abstract;
  end;

  TObserver = class
  public
    procedure Update(Subject: TSubject); virtual; abstract;
  end;

La idea es que ante algún cambio en SUBJECT que haya que informar, el método Notify recorre todos los OBSERVER conectados llamando a su método Update. Los métodos Attach y Detach están pensados para conecar un observador o desconectarlo.

En la implementación específica que hagas, TSubject debe mantener una lista interna de sus observadores, por ejemplo con un TObjectList, de manera que el método Notify se vería así:

Código Delphi [-]
procedure TSubject.Notify;
var
  I: Integer;

begin
  for I := 0 to FObservers.Count - 1 do
    TObserver(FObservers[i]).Update(Self);
end;

Puede haber muchos tipos de observadores, el único requisito sería que desciendan de TObserver e implementen el método Update. En este método, cada descendiente específico de TObsrver, hará lo que deba hacer usando la información proveniente del parámetro SUBJECT que se le pasa.

Todo esto es muy parecido a la forma en que Delphi maneja los eventos. Un Form, por ejemplo, es un observador de un TEdit que tenga dentro mediante el evento OnChange del TEdit. Cuando hay un cambio en el TEdit, se llama al evento OnChange, en caso de haber uno asignado.

La diferencia es que en el caso de eventos sólo puede haber un observador mientras que en el patrón general puede haber varios observadores, cada uno reaccionando de distinta manera.

// Saludos
Responder Con Cita