Implementazione del pattern Observer.

Abbiamo due entità: l'Observer e Observable.

  1. L'Observable è colui che notifica all'Observer un messaggio, quando, ad esempio, si necessita un cambiamento di stato. Per fare ciò si utilizza i metodi: setChanged() e notifyObserver(messaggio).
  2. L'Observer è colui che, quando gli viene notificato un messaggio, si aggiorna. Tale aggiornamento viene implementato dal metodo update().
Nel main si collega l'evento sorgente (Observable) al notificatore (Observer) tramite sorgente.addObserver(notificatore). 

L'evento sorgente (Observable) estende la clase Observable; mentre il notificatore (Observer) implementa la classe Observer.

Facciamo un esempio:


/*Evento sorgente */

import java.util.Observable;

public class EventoSorgente extends Observable{
    
    /* genera evento */
    public void generaEvento(){
        response = "Message in the bottle";
        setChanged();
        notifyObservers(response);
    }
    
    private String response;
}

/*Evento notificatore*/

import java.util.Observer;
import java.util.Observable;

public class NotificaEvento implements Observer{
    /*quando viene chiamato notifyObserver
      viene richiamato il metodo update, che notifica
      il messaggio ricevuto da EventoSorgente
    */
    
    public void update(Observable obs, Object obj){
        resp = (String) obj ;
        System.out.println(resp+" from "+obs.getClass().getName());      
    }
    
    private String resp;
}

/*Main*/

import java.util.Observable;
import java.util.Observer;

public class MioNotificatoreObserver {
    public static void main (String[] args) {
        EventoSorgente src = new EventoSorgente();
        NotificaEvento ntf = new NotificaEvento();
        src.addObserver(ntf);

        /*simula un evento richiamando il metodo
          generaEvento del sorgente*/
        src.generaEvento();
    }
}

Nulla toglie di aggiungere un altro evento sorgente, ad esempio:

/*Evento sorgente 2*/


import java.util.Observable;

public class EventSource2 extends Observable {   
    /* genera evento */
    public void generaEvento(){
        response = "Message in the bottle2";
        setChanged();
        notifyObservers(response);
    }
    
    private String response;
}

/*mentre nel main ...*/
   ...
      public static void main(String args[])
   ...
      EventoSource2 src2 = new EventoSource2();
      /*colleghiamo il secondo evento sorgente al notificatore*/
      src2.addObserver(ntf);
   ...