[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.

[...] [Patrones] Observer [...]
Pingback por LazyLoading » Blog Archive » Referencias en Java I
— 30/03/2008 #
Exelente post, esta muy claro y ese diagrama de clases concuerda perfectamente con el tema.
Me ha servido de mucho, bye.
Comentado por Benjamin
— 13/03/2009 #
Post claro, conciso e ilustrativo hasta el punto de que al final se le coge cariño al perro.
Gracias Mauricio.
Comentado por Serman
— 28/06/2010 #
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
— 18/08/2010 #
Es verdad! corregido!
Comentado por mauricio
— 01/10/2010 #
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
— 06/11/2010 #
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
— 05/10/2011 #
Está muy bien explicado, estoy leyendo sobre el asunto ya que he implementado MVC pero quería agregar este patrón
. Saludos desde Perú.
Comentado por Diego
— 05/10/2011 #