Domanda

Ho appena iniziato a giocare con Observable, Observer e del metodo update() e non riesco a capire cosa devo fare quando diverse azioni chiamano notifyObservers().

Voglio dire, la mia classe Observable ha alcuni metodi diversi che chiamano setChanged() e notifyObservers() alla fine. A seconda del metodo chiamato, una certa parte della UI (Swing) deve essere aggiornato. Tuttavia, v'è un solo metodo update() implementato nella classe Observer.

Ho pensato di passare qualcosa al metodo notifyObservers() e poi posso controllare l'argomento sulla update() ma non si sente come un buon modo per farlo. Anche se così fosse, che cosa devo passare? Una stringa con una breve descrizione dell'azione / metodo? Un int, come un codice di azione / metodo? Qualcos'altro?

Qual è il modo migliore per gestire questa situazione?

È stato utile?

Soluzione

, in generale, è necessario aggiornare tutto dal osservabile quando si riceve una chiamata a update (). se questo non è pratico, è possibile passare un suggerimento per notifyObservers ().

il libro gang-of-dice che una delle conseguenze del pattern Observer è:

"aggiornamenti imprevisti. Perché gli osservatori non hanno alcuna conoscenza della presenza di un l'altro, possono essere ciechi per il costo finale di cambiare il soggetto. Un'operazione apparentemente innocua sul tema potrebbe causare una cascata di aggiornamenti agli osservatori e ai loro oggetti dipendenti. Inoltre, i criteri di dipendenza che non sono ben definiti, o mantenuti in genere portano a aggiornamenti spurie, che può essere difficile da rintracciare.

Il problema è aggravato dal fatto che il semplice protocollo di aggiornamento fornisce nessun dettaglio su cosa è cambiato nel soggetto. Senza protocollo aggiuntivo aiuto osservatori scoprire cosa è cambiato, essi possono essere costretti a lavorare duramente per dedurre le modifiche. " anche in fase di attuazione, che dicono:

"Evitare protocolli aggiornamento osservatore-specifiche:. I modelli di spingere e tirare implementazioni del pattern Observer hanno spesso oggetto trasmissione ulteriori informazioni sulla cambiare argomento passa queste informazioni come un argomento per aggiornare la quantità di informazioni può variare.. ampiamente.

A un estremo, che noi chiamiamo il modello push, il soggetto invia osservatori dettagliate informazioni circa il cambiamento, se vogliono o no. All'altro estremo è il modello pull; il soggetto non invia niente ma il più notifiche minimo, e gli osservatori chiedere per i dettagli in modo esplicito da allora in poi.

Il modello pull sottolinea l'ignoranza del soggetto dei suoi osservatori, mentre il modello push assume soggetti sanno qualcosa le esigenze dei propri osservatori. Il modello push potrebbe rendere gli osservatori meno riutilizzabile, perché le classi Subject fare ipotesi sulle classi Observer che potrebbero non essere sempre vero. D'altra parte, il modello pull può essere inefficiente, perché le classi osservatore deve accertare che cosa è cambiato senza l'aiuto del Soggetto. "

Altri suggerimenti

Il secondo parametro su update() è di tipo Object, in modo da poter passare nulla appropriata. Come si nota, l'approccio è piuttosto generale. al contrario, una classe che mantiene un EventListenerList può ottenere un grado di run-time tipo di sicurezza quando viene utilizzato come specificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top