Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Patrón observador, attach, notify,update ... (https://www.clubdelphi.com/foros/showthread.php?t=29430)

adpa 21-01-2006 14:32:20

Patrón observador, attach, notify,update ...
 
Hola:

Estoy realizando un programa y me han dado el Diagrama de Colaboraciones del patrón observador. Me he encontrado con una serie de llamadas attach,dettach,notify y update que no se como implementar ni se lo que deben hacer exactamente.

Alguien me lo puede explicar

Gracias

roman 21-01-2006 19:51:45

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

roman 21-01-2006 20:01:34

Por cierto, si buscas en Google por "observer pattern" encontrarás no pocas referencias que explican el objetivo y delinean la implementación. Y si buscas "delphi observer pattern" encontrarás referencias del patrón específicas para Delphi.

// Saludos

dec 21-01-2006 22:47:27

Hola,

Cita:

Empezado por Román
Por cierto, si buscas en Google por "observer pattern" encontrarás no pocas [más] referencias que explican el objetivo y delinean la implementación. Y si buscas "delphi observer pattern" encontrarás [también más] referencias del patrón específicas para Delphi.

Creo que es lo suyo, porque te explicaste muy bien Román. ;)

adpa 21-01-2006 23:40:30

Hola,

Gracias por vuestras respuestas, la verdad es que tengo algún problemilla para entender en inglés asi que os agradeceria que me pusierais un ejemplo de como declarar e impletar 3 clases con este patrón. Yo lo tengo que realizar con la clase supermercado, tienda y consumidor.

Muchas Gracias

adpa 22-01-2006 01:07:40

1 Archivos Adjunto(s)
Hola:
Adjunto el diagrama de colaboraciones para que me digais como tengo que enfocar esto. Os agradecia si me dijerais las cabeceras de las funciones.

Un Saludo, y muchas Gracias


La franja horaria es GMT +2. Ahora son las 01:57:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi