Patrón Observer con C#

Posted on the abril 7th, 2007 under Design Patterns,Investigación,Programación Orientada a Objetos by Nacho

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 Clases

Diagrama de interacción (secuencia) del patrón

Diagrama de secuencia

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.

4 Responses to 'Patrón Observer con C#'

  1. noviembre 12, 2007 a las 12:49 pm
    Martín Reta
  2. noviembre 26, 2009 a las 12:43 am
    nahuelgq
  3. noviembre 26, 2009 a las 3:47 pm
    nacho

Leave a Reply




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>