[Patrones] Observer

El patrón Observer es tan simple y elegante como efectivo. Es utilizado cuando uno o más objetos (Observers) necesitan saber sobre los cambios de estados u ocurrencia de eventos producidos en un objeto Subject. La implementación más corriente se da en la arquitectura Model-View-Controller donde la vista necesita saber cuando actualizarse debido a cambios en el modelo. Observer elimina las ineficientes “esperas activas” usando un mecanismo de callback o inversión de control.

El modelo consiste en una clase Subject con referencias a todos los Observers, objetos interesados en el subject, y un metodo notifyObservers() que invoca un metodo notify() implementado por cada uno de los Observers. De esta forma cuando el Subject sufre un cambio de estado o ante un evento avisa a los Observers y mediante el callback de una funcion notify que implementa cada Observer estos reaccionan al evento.

Java proporciona una clase java.util.Observable con el comportamiento de la clase Subject y una interface java.util.Observer que describe un método update() con la logica a ejecutar ante un cambio de estado. La forma de uso deberia explicarse sola: Tenemos un objeto Perro que cumple años y un Observador que avisa que el perro cumplio años :)

class Perro extends Observable {
    private int edad;
    public void cumplirAños() {
        this.edad++;
        this.setChanged(); // se marca el objeto indicando que ha cambiado su estado.
        this.notifyObservers(); // avisa a sus observadores sobre el cambio
                              // de estado del objeto o del evento ocurrido
   }
}

El observador implementa el metodo update() que se ejecutará cuando el Perro notifique de su cambio de estado. El Perro cuenta, ademas, con un metodo addObserver(Observer o) que inserta un Observer dentro de los objetos a los que notificar los cambios o eventos.

class Observador implements Observer {
    public void update(Observable perro, Object args) {
         System.out.println("El perro cumplio años!");
    }
}

En lugar de Perros que cumplen años y Observadores que hacen regalos el escenario tipico para utilizar este patrón se presenta cuando el Observador es un elemento de una GUI (un JTextField por ejemplo) que debe actualizarse de acuerdo a los cambios que sufre el modelo de datos.

8 Comentarios »

RSS feed de los comentarios de este post. TrackBack URI

  1. [...] [Patrones] Observer [...]

    Pingback por LazyLoading » Blog Archive » Referencias en Java I ARGENTINA WordPress 2.3.3 — 30/03/2008 #

  2. Exelente post, esta muy claro y ese diagrama de clases concuerda perfectamente con el tema.
    Me ha servido de mucho, bye.

    Comentado por Benjamin SuSE Linux Mozilla Firefox 3.0.4 — 13/03/2009 #

  3. Post claro, conciso e ilustrativo hasta el punto de que al final se le coge cariño al perro.

    Gracias Mauricio.

    Comentado por Serman SPAIN Windows XP Mozilla Firefox 3.6.3 — 28/06/2010 #

  4. Estimados… esta ayuda esta por la mitad , esto funciona solo si ponemos el comando setChanged(); en la clase del subjet.
    De lo contrario nada de lo que dice aca funciona, si van a escribir un tuto , manual o una simple ayuda mas vale de hacerlo completo y no guardandose las partes importantes.
    Saludos\
    Enrique

    Comentado por Enrique Garcia Windows Vista Internet Explorer 8.0 — 18/08/2010 #

  5. Es verdad! corregido!

    Comentado por mauricio ARGENTINA Ubuntu Linux Mozilla Firefox 3.6.10 — 01/10/2010 #

  6. Tengo una duda en este esquema y en general en el patrón Observer. ¿Cómo se puede implementar esta solución cuando el observador y el observer no están en capas contiguas (es decir, que uno no invoca directamente al otro: hay clases intermedias entre la clase View y la Controller)?
    Gracias

    Comentado por Jose Francisco SPAIN Windows Vista Internet Explorer 7.0 — 06/11/2010 #

  7. Ya he implementado MVC en un programita que estoy haciendo, y ahora me falta este patrón para que quede mejor. Está muy bien explicado, muchas gracias.

    Comentado por Diego PERU Windows NT Mozilla Firefox 7.0.1 — 05/10/2011 #

  8. Está muy bien explicado, estoy leyendo sobre el asunto ya que he implementado MVC pero quería agregar este patrón :D . Saludos desde Perú.

    Comentado por Diego PERU Windows NT Mozilla Firefox 7.0.1 — 05/10/2011 #

Comentar

Captcha
Enter the letters you see above.

Entradas y comentarios feeds. 19 queries. 0.310 seconds.

60920 pages viewed, 15 today
29269 visits, 10 today
FireStats icon Powered by FireStats