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
- Mutamento di stato dell'osservabile
- Osservatori devono essere il più possibile disaccoppiati dall'osservabile
- La rimozione di osservatori
- 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 el'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>
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Programmazione - programmazione Java 1
-
Programmazione
-
Programmazione a Oggetti in Java - Relazione di progetto (videogioco)
-
Programmazione java