/ / Is n: 1 osservabile: osservatore con generici possibile in java? (modello di osservatore) - java, generici, schemi di progettazione, modello di osservatore

È osservabile n: 1: osservatore con generici possibile in java? (modello di osservatore) - java, generici, schemi di progettazione, modello di osservatore

Mi piacerebbe ascoltare le tue opinioni sull'applicazione del modello di osservatore.

Il mio obiettivo è quello di implementare una classe di osservatori concreti in grado di ascoltare più osservabili.

Se sviluppo ogni diverso osservatore come sotto, allora sarebbe semplice come sotto.

public class ConcreteObserver implements EventObserverA , EventObserverB {

updateEventA(EventA event) {}
updateEvetnB(EventB event) {}

}

In questo caso, dovrei scrivere molte diverse classi osservatore / osservabile / interfacce con quasi lo stesso snippet di codice all'interno.

Per evitare problemi come sopra, mi piacerebbe generare osservatore / ma come sapete, la regola di ereditarietà multipla non consente il codice come di seguito.

public class ConcreteObserver implements Observer<EventA> , Observer<EventB> {

update(EventA event) {}
update(EventB event) {}

}

Poiché ho almeno due eventi osservabili a due cifre da osservare in un osservatore concreto, voglio evitare di implementare ogni osservatore / coppia osservabile separatamente, se possibile.

Potrei supporre che ci potrebbe essere un modello migliore per questo caso di quello dell'osservatore, dal momento che lo schema dell'osservatore è progettato per l'osservatore n: 1: osservabile mentre il mio caso ha bisogno dell'osservatore 1: n: osservabile.

Avete qualche idea / suggerimento per questo caso?

risposte:

5 per risposta № 1

Con la magia di Java 8, il tuo ConcreteObserver non deve necessariamente implementare realmente Observer<EventA> e Observer<EventB>; se scrivi qualcosa del genere:

public class ConcreteObserver {
observeEventA(EventA event) {}
observeEventB(EventB event) {}
}

allora puoi usare ::updateEventA o ::updateEventB a ConcreteObserver istanza per ottenere un metodo che è automaticamente convertibile in Observer<EventA> o Observer<EventB> interfaccia funzionale Ad esempio, puoi scrivere uno dei seguenti:

  • Observer<EventA> eventAObserver = concreteObserver::updateEventA;
  • Observer<EventB> eventAObserver = new ConcreteObserver()::updateEventB;
  • observerRegistry.register(EventA.class, concreteObserver::updateEventA);