Observador

1 Sinopsis

Permite a un conjunto de objetos registrar dependencias entre objetos, de tal forma que un objeto notificara sus cambios en estado a todos los objetos que dependen de el.

2 Contexto

Se necesita notificar a objetos interasados sobre el cambio de el objeto Observado

3 Solucion

El diagrama UML se muestra a continuacion

4 Consecuencias

5 Ejemplo

El diagrama UML es el siguiente:

Existe una clase que tiene una cadena de caracteres. Cuando alguien cambie esta cadena via un metodo de acceso, se necesita notificar el cambio a todos los interesados


public class StringBean  {
    ....
}
See the complete code for StringBean here.
  private String _mio;
  private java.util.Vector _vec ;
  public StringBean(String s) { 
      _mio =s;
      _vec = new java.util.Vector();
 }  
  public void addObserver(ObserverIF obv) { 
         _vec.addElement(obv);
  }
  public String getMio() { return _mio;}
  public void setMio(String s) {
     _mio= s;
     int sz = _vec.size();
     for ( int i=0; i < sz ; i++) {
        ObserverIF observer=(ObserverIF) _vec.elementAt(i);
        observer.notificar();
     }
  }

La interfase ObserverIF indica el contrato para todos aquellos objetos que se interesen en observar


public interface ObserverIF  {
    ....
}
See the complete code for ObserverIF here.
  
  public void notificar();

La clase Observador, implementa el metodo notify, a cada observador se le pone un nombre, via el constructor


public class Observer implements ObserverIF  {
    ....
}
See the complete code for Observer here.
   private String _nombre;
   public Observer(String nombre) { this._nombre = nombre; }
   public void notificar() { 
    System.out.println(this._nombre+" notificado");
   }

El cliente, crea un StringBean, va agregando varios observadores y luego aplica el cambio


public class ObserverCliente  {
    ....
}
See the complete code for ObserverCliente here.
  public static void main(String [] args) {
     StringBean s= new StringBean("hola mundo");
     s.addObserver(new Observer("observador 1"));
     s.addObserver(new Observer("observador 2"));
     s.addObserver(new Observer("observador 3"));
     s.setMio("adios cruel mundo");
  }