Aplicando Patrones, Observer

Para este articulo intenté de recrear uno de los patrones más populares como es el "Observer", la idea es mostrar un ejemplo claro con código sobre un esquema Web particularmente ASPNET con C#.

Veamos, para comenzar definiremos que implica el patrón de forma conceptual:


"El patrón observer define una dependencia uno a muchos entre objetos de modo que cuando el estado de un objeto cambia, se les notifica el cambio a todos los que dependen de él y se actualizan de forma automática".

Nota: (Les dejo un vínculo a la wikipedia para matizar un poco un concepto bien simple: http://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o) )

Yo voy a tomar la herramienta de modelado EA que me propone la aplicación del patrón GOF Observer, veamos:



Como podemos observar los elementos del patrón son muy bien identificables:


Subject: Conoce a sus observadores, que pueden ser de 0 a N, y ofrece la posibilidad de añadir y eliminar observadores.

Observer: Define la interfaz que sirve para notificar a los observadores los cambios realizados en el Subject.

ConcreteSubject: Almacena el estado que es objeto de interés de los observadores y envía un mensaje a sus observadores cuando su estado cambia.

ConcreteObserver Mantiene una referencia a un ConcreteSubject. Almacena el estado del Subject que le resulta de interés e implementa la interfaz de actualización de Observer para mantenerla consistencia entre los dos estados


Vamos entonces a la aplicación desarrollada donde hice algunas modificaciones para utilizar interfaces en lugar de herencia en los observadores.



Les voy a desarrollar partes importantes de cada uno de los elementos:

Catalogo (Subject):

Vamos a ver un método importante como es el notificar:



public
void Notificar()

{


//Bucle de control de asociados


foreach (IAsociado asociado in asociados)

{

asociado.Actualizar(this);

}


}


Y la propiedad precio que es la que quiero controlar en mi diseño:



///
<summary>


/// Propiedad controlada por la notificacion


///
</summary>


public
double Precio

{


get { return precio; }


set

{

precio = value;

Notificar();

}

}

En el observador he implementado un delagado y evento para propagar la notificación a la página web.


//Voy a utilizar un delegado para el esquema de notificacion desde el objeto.


public
delegate
void
Aviso(object sender,object senderbis, EventArgs e);


public
void Actualizar(Catalogo catalogo)

{


//


EventArgs e = new
EventArgs();

avisoActualizar(catalogo, this,e);

}

Solo resta programar mi página web y para la demo utilizo toda la programación sobre el load de la página:



protected
void Page_Load(object sender, EventArgs e)

{


Telefono objTelefono = new
Telefono("X123", 100);



Asociado demo1 = new
Asociado("Nico", "Bortolotti");


Asociado demo2 = new
Asociado("Martin", "Bortolotti");


demo1.avisoActualizar += new
Aviso(this.Demo_Aviso);

demo2.avisoActualizar += new
Aviso(this.Demo_Aviso);


objTelefono.AgregarAsociado(demo1);

objTelefono.AgregarAsociado(demo2);


objTelefono.Precio = 200;



}

Declaro un catalogo concreto de teléfono, luego dos asociados y posteriormente los agrego a mi catalogo, como ejemplo final le cambio el precio al catalogo para que se genere la notificación a sus suscriptos.


Este es el resultado final donde muestro a quien se notifica y el precio de cambio, como ejemplo.

Bien, espero que les sea interesante la aplicación de este patrón.

Código de ejemplo y modelo:

http://sites.google.com/site/nbortolotti/practicas-programacion/practica-implementacion-observer

Comentarios

Entradas más populares de este blog

Modelando relaciones en UML, un acercamiento a las Asociaciones

Utilizando Intents implícitos para crear actividades

Secuencias…Modelado indispensable