Programmazione 1 - I design pattern in Java observer
Appunti di Programmazione 1 per l'esame della professoressa Di Stefano. Gli argomenti che vengono trattati sono i seguenti: i design pattern in Java observer, i prerequisiti: la buona conoscenza …
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 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
Anteprima di 6 pagg. su 22. Scarica il documento per vederlo tutto.
Scienze matematiche e informaticheINF/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.
Ciao! Sono il tuo Tutor AI, il compagno ideale per uno studio interattivo. Utilizzo il metodo maieutico per affinare il tuo ragionamento e la comprensione. Insieme possiamo:
Risolvere un problema di matematica
Riassumere un testo
Tradurre una frase
E molto altro ancora...
Cosa vuoi imparare oggi?
Il Tutor AI di Skuola.net usa un modello AI di Chat GPT.
Per termini, condizioni e privacy, visita la relativa pagina.