Mi rendo conto che questo argomento è stato coperto a morte, ma sono ancora in difficoltà e potrebbe fare con qualche aiuto specifico.Schema di osservatore ad accoppiamento lento
Il mio obiettivo è quello di implementare un semplice modello di Osservatore tra un tipo di osservabile (diciamo un cane) e un qualche tipo di ascoltatore (diciamo Proprietario).
Eventualmente il proprietario sarebbe una "vista" e il cane un "modello" in un paradigma MVC. Sto usando Dog and Owner solo per cercare di semplificare le cose qui.
Ho tentato di utilizzare le classi Observer/Observable di Java, ma ho capito quanto sia pessimo il metodo update() di Observers: riceve un POJO e dovrei controllare/cast quel POJO nel metodo update(). Preferirei che il mio metodo 'update()' ottenga qualcosa che può aspettarsi.
Così, ho seguito un paio di tutorial, compreso questo, che utilizza il cane/proprietario a titolo di esempio:
http://www.youtube.com/watch?v=qw0zZAte66A
Qui mi è stato mostrato come rotolare il mio Observer/classi osservati. In pseudo-codice, quello che ora ho è questa:
Dog/Model {
List listeners;
public fireDogHungryEvent() {
foreach listener {
listener.onDogHungry(this);
}
}
public fireDogPeeEvent() {
foreach listener {
listener.onDogNeedsToPee(this);
}
}
public getHungerLevel() { return hungerLevel; }
public getBladderCapacity() { return bladderCapacity; }
}
Owner/View {
public onDogHungry(model) {
println(model.getHungerLevel());
}
public onDogNeedsToPee(model) {
println(model.getBladderCapacity());
}
}
Così ora metodo piuttosto che un aggiornamento(), ho metodi che gestiscono eventi specifici. Brillante. Al momento sono soddisfatto della classe Owner/view. Conosce i metodi del cane/modello e va bene (credo).
Quello che non mi piace è che il cane/modello ha riferimenti ai metodi nel proprietario/vista. Ho letto innumerevoli volte e sono completamente d'accordo sul fatto che un modello non dovrebbe essere strettamente accoppiato alle sue opinioni, come sembra essere al di sopra. Anch'io non sono entusiasta di tutti i metodi di 'fuoco' nel Cane/modello che fanno quasi la stessa cosa; looping su tutti i suoi ascoltatori e solo chiamando un metodo diverso su ciascun ascoltatore.
E 'possibile disaccoppiare ulteriormente questa relazione e non avere i metodi specifici di chiamata Cane/modello? In tal caso, qual è il modo migliore per andare a ricevere i dati Cane/Modello nel Proprietario/vista e lavorare in modo appropriato?
Grazie
Quali metodi di 'Cane' hanno riferimenti alla vista? Io non ne vedo. – SJuan76
Il modo migliore è utilizzare un'interfaccia, suggerita dal tutorial video. L'ascoltatore è un'interfaccia nella tua implementazione? –
SJuan76 - i riferimenti di cui sto parlando sono le chiamate a listener.onDogHungry e listener.onDogNeedsToPee nei metodi Dog 'fire'. – whoshotdk