Estratto del documento

Observer

Nome: Observer

Sinonimo: "Publish and Subscribe"

Intento: un oggetto che ha uno stato interno, si vuole che ad ogni suo cambiamento di stato, altri oggetti (osservatori) ricevano una notifica automatica, in modo da rimanere sempre aggiornati.

In realtà l'osservatore non osserva ma rimane in attesa che gli venga detto di andare a guardare.

Problemi:

  • la variazione di stato troppo tardi
  • scoprire qualche variazione di stato nel caso di parecchie variazioni in sequenza
  • poco scalabile se si hanno molti osservatori

Soluzione:

Observer: le forze

Le forze che condizionano la soluzione sono:

  • osservatori possono essere molti
  • l'osservatore può agire diversamente a seguito della notifica dell'avvenuto
  1. Mutamento di stato dell'osservabile
  2. Osservatori devono essere il più possibile disaccoppiati dall'osservabile
  3. La rimozione di osservatori
  4. L'aggiunta può avvenire senza modificare il codice dell'osservabile

Observer: partecipanti

  • Subject: Conosce i suoi observers
  • Permette la registrazione e la rimozione di oggetti Observer
  • Observer: Definisce una interfaccia per gli oggetti che devono essere avvisati della variazione del Subject
  • Concrete Subject: Contiene gli stati che interessano gli oggetti Concrete Observer
  • Spedisce una notifica ai suoi observers quando cambia il suo stato
  • Concrete Observer: Contiene uno stato che dovrebbe essere consistente con quello del Subject
  • Implementa la interfaccia Observer per mantenere il suo stato consistente con quello del subject

Observer: soluzione (prerequisito: Gli osservatori si registrano presso l'oggetto osservato)

Quando l'oggetto osservato cambia stato, notifica

tutti gli osservatori (ne invoca un metodo) Quando notificato, ogni osservatore decide: - cosa fare: - Niente all'osservato informazioni sullo stato - Richiedere - ... - Observer: soluzione Gli osservatori potrebbero essere varie "viste" sullo stesso oggetto: - di un foglio elettronico e loro rappresentazioni - Dati tabellari, grafiche, ... L'oggetto osservato non conosce l'identità precisa degli osservatori: - "cambiare trasmettitore radio ogni volta che un'autoradio entra in città..." Gli osservatori si aggiungono/tolgono al runtime Observer: esempio applicazione Gli osservatori devono potersi registrare: - l'oggetto osservato deve fornire un'interfaccia standard per la registrazione: attach() detach() L'oggetto osservato deve poter notificare: - gli osservatori devono fornire un'interfaccia standard per la notifica e

l'oggetto update() osservato ha che chiama tutti gli notify() update dei registrati Observer: diagramma di classe Observer: diagramma di sequenza Concrete Subject Concrete Observer 1 Concrete Observer 2 Attach() Attach() setState() notify() update() update() getState() Observer: commenti Chi invoca setState()? Chiunque degli osservatori Uno Chi invoca notify()? metodo dell'oggetto osservato che Ogni modifica lo stato cliente, dopo che ha terminato una Il sequenza di modifiche Observer: metodo update La signature del metodo update() è: public void update(Observable o, Object arg) L'osservabile (subject) passa una una referenza a se stesso e possibilmente un argomento contenente informazioni sul nuovo stato. Un Observer può essere associato a più di un subject e può determinare l'origine dell'update usando il primo argomento. Push vs. Pull Pull: non passa nessuna info sullo stato, l'osservatore update() userà

<pre>
getState()Push: passa anche lo stato
update() Observer in Java
// import java.util;
public class Observable extends Object {
    public void addObserver(Observer o);
    public void deleteObserver(Observer o);
    public boolean hasChanged();
    public void notifyObservers();
    public void notifyObservers(Object arg);
}

public abstract interface Observer {
    public abstract void update(Observable o, Object arg);
}

public class Subject extends Observable{
    public void setState(String filename);
    public string getState();
}

Observer: codice
import java.util.*;

interface Observer {
    void update();
}

class Observable {
    private Vector observers = new Vector();

    public void addObserver(Observer o){
        observers.addElement(o);
    }

    public void removeObserver(Observer o){
        observers.removeElement(o);
    }

    protected void notifyObservers(){
        for(int i=0; i<observers.size(); i++){
            Observer o = (Observer)observers.elementAt(i);
            o.update();
        }
    }
}
</code>
Anteprima
Vedrai una selezione di 6 pagine su 22
Programmazione 1 - I design pattern in Java observer Pag. 1 Programmazione 1 - I design pattern in Java observer Pag. 2
Anteprima di 6 pagg. su 22.
Scarica il documento per vederlo tutto.
Programmazione 1 - I design pattern in Java observer Pag. 6
Anteprima di 6 pagg. su 22.
Scarica il documento per vederlo tutto.
Programmazione 1 - I design pattern in Java observer Pag. 11
Anteprima di 6 pagg. su 22.
Scarica il documento per vederlo tutto.
Programmazione 1 - I design pattern in Java observer Pag. 16
Anteprima di 6 pagg. su 22.
Scarica il documento per vederlo tutto.
Programmazione 1 - I design pattern in Java observer Pag. 21
1 su 22
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher unigruppi di informazioni apprese con la frequenza delle lezioni di Programmazione 1 e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Catania o del prof Di Stefano Antonella.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community