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.

observer

Per le sue modalità di utilizzo, il pattern rientra nella categoria dei Comportamentali.

 

DIAGRAMMA UML

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 

 

LINK UTILI