Il pattern Observer viene utilizzato quando esiste una relazione uno-a-molti tra oggetti, ad esempio se un oggetto viene modificato, i suoi oggetti dipendenti dovranno essere notificati automaticamente.
Per le sue modalità di utilizzo, il pattern rientra nella categoria dei Comportamentali.
DIAGRAMMA UML
IMPLEMENTAZIONE OBSERVER
Step 1: Creiamo la classe Soggetto
import java.util.ArrayList;
import java.util.List;
public class Soggetto {
private List observers = new ArrayList();
private int stato;
public int getStato() {
return stato;
}
public void setStato(int stato) {
System.out.println("[SOGGETTO]: setStato()::start");
this.stato = stato;
notifica();
System.out.println("[SOGGETTO]: setStato()::end ");
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifica(){
System.out.println("[SOGGETTO]: notifica()::start");
for (Observer observer : observers) {
observer.aggiorna();
}
System.out.println("[SOGGETTO]: notifica()::end");
}
}
Step 2: Creiamo la classe astratta Observer
public abstract class Observer {
protected Soggetto soggetto;
public abstract void aggiorna();
}
Step 3: Creiamo le 3 classi concrete
OsservatoreBinario.java
public class OsservatoreBinario extends Observer {
public OsservatoreBinario(Soggetto soggetto){
this.soggetto = soggetto;
this.soggetto.attach(this);
}
@Override
public void aggiorna() {
System.out.println("[OSSERVATORE_BINARIO]: aggiorna()::start");
System.out.println("Binary String: " + Integer.toBinaryString( soggetto.getStato()));
}
}
OsservatoreOttale.java
public class OsservatoreOttale extends Observer {
public OsservatoreOttale(Soggetto soggetto){
this.soggetto = soggetto;
this.soggetto.attach(this);
}
@Override
public void aggiorna() {
System.out.println("[OSSERVATORE_OTTALE]: aggiorna()::start");
System.out.println("[OSSERVATORE_OTTALE]: Stringa Ottale: " + Integer.toOctalString( soggetto.getStato()));
System.out.println("[OSSERVATORE_OTTALE]: aggiorna()::end");
}
}
OsservatoreEsadecimale.java
public class OsservatoreEsadecimale extends Observer {
public OsservatoreEsadecimale(Soggetto soggetto){
this.soggetto = soggetto;
this.soggetto.attach(this);
}
@Override
public void aggiorna() {
System.out.println("[OSSERVATORE_ESADECIMALE]: aggiorna()::start");
System.out.println("[OSSERVATORE_ESADECIMALE]: Stringa esadecimale: " + Integer.toHexString(soggetto.getStato()).toUpperCase());
System.out.println("[OSSERVATORE_ESADECIMALE]: aggiorna()::end");
}
}
Step 4: Usiamo le classi con il Main
public class Main {
public static void main(String[] args) {
Soggetto soggetto = new Soggetto();
new OsservatoreEsadecimale(soggetto);
new OsservatoreOttale(soggetto);
new OsservatoreBinario(soggetto);
System.out.println("[MAIN]: Cambio stato -> 15");
soggetto.setStato(15);
System.out.println("[MAIN]: Cambio stato -> 10");
soggetto.setStato(10);
}
}
Step 5: Output
[MAIN]: Cambio stato -> 15
[SOGGETTO]: setStato()::start
[SOGGETTO]: notifica()::start
[OSSERVATORE_ESADECIMALE]: aggiorna()::start
[OSSERVATORE_ESADECIMALE]: Stringa esadecimale: F
[OSSERVATORE_ESADECIMALE]: aggiorna()::end
[OSSERVATORE_OTTALE]: aggiorna()::start
[OSSERVATORE_OTTALE]: Stringa Ottale: 17
[OSSERVATORE_OTTALE]: aggiorna()::end
[OSSERVATORE_BINARIO]: aggiorna()::start
Binary String: 1111
[SOGGETTO]: notifica()::end
[SOGGETTO]: setStato()::end
[MAIN]: Cambio stato -> 10
[SOGGETTO]: setStato()::start
[SOGGETTO]: notifica()::start
[OSSERVATORE_ESADECIMALE]: aggiorna()::start
[OSSERVATORE_ESADECIMALE]: Stringa esadecimale: A
[OSSERVATORE_ESADECIMALE]: aggiorna()::end
[OSSERVATORE_OTTALE]: aggiorna()::start
[OSSERVATORE_OTTALE]: Stringa Ottale: 12
[OSSERVATORE_OTTALE]: aggiorna()::end
[OSSERVATORE_BINARIO]: aggiorna()::start
Binary String: 1010
[SOGGETTO]: notifica()::end
[SOGGETTO]: setStato()::end
0 Comments