e-commerce84
19-05-2010, 11:56
Ciao,
stò studiando i pattern applicati a Java.
Attualmente mi stò vedendo il pattern Observer che viene usato praticamente in tutte le GUI.
Mi dite se ho capito bene?
Allora io ho sostanzialmente ho due tipi di oggetti:
1) Un SOGGETTO (o publisher) che di fatto rappresenta i miei dati.
2) Vari OBSERVER (o listener) che di fatto rappresentano una specifica vista dei mie dati (mantenendosi sincronicatti con il soggetto)
La logica che ci stà dietro è la seguente: Il soggetto rappresenta i miei dati e si manterrà una lista di tutti gli osservatori che lo stanno osservando (che vogliono quindi rappresentare i dati e le loro modifiche quando esse avvengono).
Quando i dati subiscono una modifica il soggetto invia una notifica a tutti i suoi osservatori che si auto aggiorneranno e forniranno una nuova vista dei dati.
(Es: ho un foglio di excell. I dati nel sistema sono il soggetto. La rappresentazione è l'osservatore. Tramite l'osservatore modifico il valore di una cella. Il soggetto ricalcola con una formula i valori di tutte le altre celle del foglio di calcolo che vengono così modificate, così avverte l'osservatore della modifica, esso si aggiorna e visualizza i nuovi valori di tutte le celle)
Esempio in codice:
Observer la dichiaro come un'interfaccia, poi ovviamente devo implementarla ed in base al tipo concreto dell'Observer il metodo update aggiornerà la vista o farà qualcosa in uno specifico modo:
/* Interfaccia che rappresenta i vari oggetti osservatori che a loro volta
* rappresentano una specifica rappresentazione dei dati
*/
public interface Observer {
public void update(Subject subject) ; // Metodo astratto che modifica i dati
}
Subject:
import java.util.Vector;
/* Classe che rappresenta i dati su cui si basano le viste */
public class Subject{
/* Crea un vettore che conterrà la lista di tutti gli osservatori che lo
* osservano */
protected Vector observers = new Vector();
public void addObserver(Observer o){ // Aggiunge un oggetto Observer al vettore
observers.addElement(o);
}
public void removeObserver(Observer o){ // Rimuove un osservatore dal vettore
observers.removeElement(o);
}
/* Notifica agli oggetti osservatori che c'è stata una modifica dei dati
* rappresentati da Subject */
public void notify(){
Enumeration e = observers.getElements();
while (e.hasMoreElements()) {
/* Invoca il metodo update su tutti gli osservatori per modificare le viste */
((Observer)e.nextElement()).update(this);
}
}
}
mmm...il mio ragionamento è corretto?
Grazie
stò studiando i pattern applicati a Java.
Attualmente mi stò vedendo il pattern Observer che viene usato praticamente in tutte le GUI.
Mi dite se ho capito bene?
Allora io ho sostanzialmente ho due tipi di oggetti:
1) Un SOGGETTO (o publisher) che di fatto rappresenta i miei dati.
2) Vari OBSERVER (o listener) che di fatto rappresentano una specifica vista dei mie dati (mantenendosi sincronicatti con il soggetto)
La logica che ci stà dietro è la seguente: Il soggetto rappresenta i miei dati e si manterrà una lista di tutti gli osservatori che lo stanno osservando (che vogliono quindi rappresentare i dati e le loro modifiche quando esse avvengono).
Quando i dati subiscono una modifica il soggetto invia una notifica a tutti i suoi osservatori che si auto aggiorneranno e forniranno una nuova vista dei dati.
(Es: ho un foglio di excell. I dati nel sistema sono il soggetto. La rappresentazione è l'osservatore. Tramite l'osservatore modifico il valore di una cella. Il soggetto ricalcola con una formula i valori di tutte le altre celle del foglio di calcolo che vengono così modificate, così avverte l'osservatore della modifica, esso si aggiorna e visualizza i nuovi valori di tutte le celle)
Esempio in codice:
Observer la dichiaro come un'interfaccia, poi ovviamente devo implementarla ed in base al tipo concreto dell'Observer il metodo update aggiornerà la vista o farà qualcosa in uno specifico modo:
/* Interfaccia che rappresenta i vari oggetti osservatori che a loro volta
* rappresentano una specifica rappresentazione dei dati
*/
public interface Observer {
public void update(Subject subject) ; // Metodo astratto che modifica i dati
}
Subject:
import java.util.Vector;
/* Classe che rappresenta i dati su cui si basano le viste */
public class Subject{
/* Crea un vettore che conterrà la lista di tutti gli osservatori che lo
* osservano */
protected Vector observers = new Vector();
public void addObserver(Observer o){ // Aggiunge un oggetto Observer al vettore
observers.addElement(o);
}
public void removeObserver(Observer o){ // Rimuove un osservatore dal vettore
observers.removeElement(o);
}
/* Notifica agli oggetti osservatori che c'è stata una modifica dei dati
* rappresentati da Subject */
public void notify(){
Enumeration e = observers.getElements();
while (e.hasMoreElements()) {
/* Invoca il metodo update su tutti gli osservatori per modificare le viste */
((Observer)e.nextElement()).update(this);
}
}
}
mmm...il mio ragionamento è corretto?
Grazie