Patrón Observer con C#
Acá va una implementación posible del patrón Observer, escrita en C#. La escribí en el contexto de una aplicación para la automatización de tareas desde una cuenta de correo con acceso POP3. La idea básicamente era lograr implementar varios patrones de diseño, con el fin de aprender como se utilizaban y en que contextos.
Sobre la aplicación escribiré más adelante.
Vamos a observar el patrón ahora.Diagrama de clases del patrón
Diagrama de interacción (secuencia) del patrón
Me pareción conveniente implementar el Subject como una clase, ya que hay comportamiento común que deben adquirir los Sujetos concretos (ConcreteSubject).En cambio con el Observer, me pareció mejor una Interfaz, ya que cada observer debe decidir en su método Update que realizar. Cuando este objeto observador reciba un mensaje update realizará un casting a la clase que lo está notificando (recordar que él sabe a quién observa, pero los observados no saben que tipo de objetos los observan), y luego solicitará la información que necesite para ejecutar la acción que requiera.
Clase Subject.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using System; using System.Collections; namespace AutomatizadorPop { /// <summary> /// Esta clase deberá ser especializada por aquellas que deseen tener /// el comportamiento de un Sujeto (objeto observado) /// </summary> public abstract class Subject { private ArrayList observers=new ArrayList(); public void AddObserver(IObserver observer) { observers.Add(observer); } public void RemoveObserver(IObserver observer) { observers.Remove(observer); } public void Notify(){ foreach(IObserver observer in observers) { observer.Update(this); } } } } |
Interfaz IObserver.
1 2 3 4 5 6 7 8 9 10 11 | using System; namespace AutomatizadorPop { /// <summary> /// Esta interfaz debe ser implementada por cualquiera que quiera /// observar un Subject. /// </summary> public interface IObserver { void Update(Subject sender); } } |
En el contexto de la aplicación que estaba realizando, el ConcreteSubject era un objeto que revisaba una cuenta de email (mediante pop3) en busca de emails. Cuando encontraba un email avisaba a sus objetos observantes mediante Notify(). En este caso tenía uno solo que lo observaba, y que cada vez que era notificado, buscaba comandos en el cuerpo del correo electrónico.
El haber utilizado este patrón permitía crear otro observador, que cada vez que llegara un correo, por ejemplo, avisara a mi celular. O bien otro que extraiga información y la almacene en una DB.
En próximos post voy a ir completando con el resto de la aplicación.
Martín Reta
Muchas gracias por el ejemplo, sigan así!!! EXCELENTE!.
Un abrazo desde Córdoba.
Open Minded » Una aplicación escalable a modo de ejemplo
[…] Semántica (1) « Patrón Observer con C# El poder de la subversion […]
nahuelgq
Gracias por el código!
En mi proyecto le hice una modificación, ya que no me gusta que todos los objetos observables estén obligados a herdear de Subject. Creé una interfaz ISubject con los mismos métodos de Subject, luego, en la clase que implementa ISubject puedo crear un Subject concreto y delegar todas las llamadas a este objeto. Si no se entiende lo puedo mostrar con un diagrama de clases.
Saludos!
nacho
Creo que te entiendo y me parece muy válida tu apreciación. El comportamiento común se puede delegar a otro objeto 😀
Si te animás y querés poner un diagrama, mandalo que lo agrego así enriquecemos esto para todos!
Saludos y gracias!