
Java design patterns: Observer
Eccoci ad una nuova puntata della serie dedicata ai design patterns, implementati in particolare utilizzando il linguaggio JAVA, parleremo dell’Observer pattern.
Con questo pattern un oggetto, definito “il soggetto”, mantiene una lista di oggetti dipendenti, definiti “osservatori”, che vengono notificati istantaneamente di ogni cambiamento nello stato del “soggetto” stesso, normalmente chiamando uno dei loro metodi.
Principalmente è utilizzato per implementare sistemi distribuiti di gestione degli eventi.
Nella figura che segue lo schema UML relativo al pattern “Observer”.
Nell’esempio pratico di implementazione in JAVA del pattern, l’input ogni linea di input da tastiera viene trattata come un evento, l’esempio è basato sulla libreria di classi java.util.Observer
e java.util.Observable
.
Quando viene acquisita una stringa tramite System.in, viene chiamato il metodo
notifyObservers, per notificare gli oggetti osservatori dell’avvenuto evento, mediante l’invocazione del loro metodo
update, vediamo il codice:
Iniziamo con il file ObservableObject.java
che implementa il Soggetto “osservato”.
package org.bonadonna.patterns.examples;
import java.util.Observable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ObservableObject extends Observable implements Runnable {
public void run() {
try {
final InputStreamReader isr = new InputStreamReader(System.in);
final BufferedReader br = new BufferedReader(isr);
while(true) {
String response = br.readLine();
setChanged();
notifyObservers(response);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
vediamo poi il file ObserverObject.java
che implementa un osservatore.
package org.bonadonna.patterns.examples;
import java.util.Observable;
import java.util.Observer;
public class ObserverObject implements Observer {
private String resp;
public void update (Observable obj, Object arg) {
if (arg instanceof String) {
resp = (String) arg;
System.out.println("\nReceived Response: " + resp);
}
}
}
e per finire il file AppExample.java
che contiene il metodo main per l’esecuzione dell’esempio
package org.bonadonna.patterns.examples;
public class AppExample {
public static void main(String args[]) {
System.out.println("Inserisci un testo :");
final ObservableObject observableObj = new ObservableObject();
final ObserverObject observerObj = new ObserverObject();
observableObj.addObserver(observerObj);
Thread thread = new Thread(observableObj);
thread.start();
}
}

2 commenti
Marco
Ottima spiegazione grazie.
Saluti
Andrea Bonadonna
Saluti a te e grazie per l’interesse! 🙂