[Design] Pattern observer


Un pattern assai famoso che abbiamo usato pesantemente nell'ultimo progetto
è l' OBSERVER
Abbiamo osservato tutti gli eventi significativi che succedono; tipicamente: 

  • l'evento scatenante di ingresso che scatena un certo use case
  • tutte le chiamate verso i sistemi esterni e le risposte ottenute
  • la risposta dello use case invocato


Tale struttura è tornata utile per le seguenti implementazioni concrete: 


  • 'database' observer, che a fronte degli eventi interessati esegue delle operazioni sul database, tipicamente l'aggiornamento di timestamp di una macchina a stati
  • 'logger' observer, che stampa su log gli avvenimenti significativi del sistema.
  • 'latency' observer, che calcola il tempo di esecuzione di uno use case
  • 'statistic' observer, che memorizza in stutture dati l'andamento delle chiamatesecondo particolari regole di business (ad esempio quali e quanti use case sono statiscatenati in un intervallo di tempo) 
  • 'audit' observer, per salvare su database quale utente sta eseguendo una operazione sensibile


Tutti questi observer sono richiamati da un observer list iniettato nell'oggetto che incapsula il flusso principale.

Ad esempio se vogliamo notificare l'evento di 'messaggio in ingresso' : 

 public void execute(IncomingMessage message) {
    observerList.notifyIncomingMessage(message);
    doSomething()...
 }

 dove observerList è una implementazione concreta dell'interfaccia CustomObserver : 

 public class ObserverList implements CustomObserver {
    private final List observers;
    public void notifyIncomingMessage(IncomingMessage message) {
  for (CustomObserver customObserver : observers) {
customObserver.notifyIncomingMessage(message);
}
  }

Grazie a questo pattern il codice principale è ignaro dei dettagli a contorno. 

Mi piace anche l'effetto teorico che puoi sfilare un certo observer in modo che il sistema
continui ad andare
Immagino una situazione estrema dove ad esempio si scopre che il 'logger' observer  per un qualche baco sta rallentando pesantemente la produzione. Nel frattempo che si indaga il baco si potrebbe rimuovere questo observer dalla ObserverList e tutto continuerebbe ad andare, senza causare disservizio.

Nessun commento: