View Full Version : [Java] Patten Observer
beppegrillo
10-03-2009, 11:21
Come evitare quella lunga lista di if nel metodo update dell'oggetto observer?
Ho bisogno di averere aggiornamenti diversi, al momento nel metodo update ho controlli del tipo
public void update(Observable o, Object arg) {
if (arg.equals("Aggiungi"))
// fai qualcosa
else if (arg.equals("Modidifca"))
//etc
}
puoi cambiarla con una lunga lista di funzioni infilata in una mappa. A quel punto il tuo metodo update apparirà come:
public void update(Observable o, Object arg) {
functionMap.get(arg).compute();
}
o
public void update(Observable o, Object arg) {
functionMap.get(System.identityHashCode(arg)).compute();
}
se prevedi che arg possa assumere il valore "null".
Qui si suppone l'esistenza di un'ipotetica classe Function, presumibilmente nella forma:
public interface Function<R, P> {
R compute(P...args);
}
Puoi anche usare dei Runnable se non ti interessa generalizzare. La funzione concreta diventerebbe istanza anonima di Function. Ad esempio:
Map<Integer, Function<Object, Object>> functionMap = new HashMap<Integer, Function<Object, Object>>();
functionMap.put("ciao".hashCode(), new Function<Object, Object>() {
public Object compute(Object...args) {
System.out.println("ciao");
}
});
Se usi un trampolino riflessivo puoi evitare la necessità di definire classi interne (ma paghi un prezzo in termini di gestione dell'accesso alle funzioni).
beppegrillo
10-03-2009, 13:48
Grazie della risposta.
La soluzione che proponi è un buon rimedio per la catena di if, ma ho l'impressione che si continui a delegare troppo la cosa ad un "codice".
Stò leggendo questo paper per la notifica di eventi http://www.ubilab.org/publications/print_versions/pdf/tapos-96-event.pdf, sembra un interessante soluzione, resta da capire la fattibilità.
E' uguale, dal punto di vista meccanico. Taglia gli if passando funzioni membro.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.