Osservando più osservabili contemporaneamente / Rete di osservatori incatenati

2

Esempio rapido:

  • HM osserva CM
  • SM osserva CM
  • HSM osserva HM e SM, ma vuole essere aggiornato solo dopo che entrambi hanno il loro nuovo valore derivato da CM.

Maggiori dettagli:

(questo è ancora un esempio inventato, ma il più vicino e il più semplice che riesco a trovare)

class ColorModel :

  • può memorizzare qualsiasi colore RGB.
  • osservabile da un oggetto ColorObserverInterface.

class HueModel implements ColorModelObserverInterface

  • può memorizzare il valore di tonalità derivato da un colore RGB.
  • osserva un oggetto ColorModel per aggiornare il suo valore di tonalità.
  • osservabile da un oggetto HueObserverInterface.
  • gli osservatori vengono avvisati solo se la tonalità è effettivamente cambiata.

class SaturationModel implements ColorObserverInterface

  • può memorizzare il valore di saturazione derivato da un colore RGB.
  • osserva un oggetto ColorModel per aggiornare il suo valore di saturazione.
  • osservabile da un SaturationObserverInterface.
  • gli osservatori vengono avvisati solo se la saturazione è effettivamente cambiata.

class HueSaturationMonitor implements HueObserverInterface, SaturationObserverInterface

  • visualizza un punto la cui coordinata x rappresenta la tonalità e la coordinata y rappresenta la saturazione.
  • osserva un oggetto HueObserver e un oggetto SaturationObserver.

Problemi:

  • Ogni volta che cambia il colore in ColorModel, vengono attivati fino a due aggiornamenti sull'oggetto HueSaturationMonitor.
  • nel caso in cui il nuovo colore abbia la stessa saturazione di prima, solo i trigger dell'aggiornamento della tonalità - e viceversa.
  • L'ordine in cui i due aggiornamenti si attivano dipende dall'ordine di abbonamento dei due osservatori su ColorModel.
  • Ci sarà uno stato intermedio quando la coordinata x di HueSaturationMonitor è già sul nuovo valore, mentre la coordinata y è ancora sul vecchio valore, perché solo uno dei due aggiornamenti è già stato attivato. Per l'esempio, supponiamo che uno qualsiasi stato intermedio di HueSaturationMonitor non sia desiderabile e vogliamo passare direttamente alla posizione x / y finale.
  • HueSaturationMonitor può funzionare correttamente solo se sia HueModel che SaturationModel sono abbonati allo stesso ColorModel. Non c'è modo di applicarlo dall'interno di HueSaturationModel.

Domanda:

Come posso organizzare osservatori interdipendenti, senza dipendere troppo dall'ordine in cui sono iscritti l'uno all'altro? Come posso ritardare un trigger fino a quando tutte le fonti sono state aggiornate?

Perché non si tratta di un duplicato?

Ci sono altre domande che trattano osservatori multipli e osservabili collegati per formare una rete. Questa rete può essere disegnata come un grafico diretto.

La caratteristica distintiva di questa domanda è nella natura e nella topologia di questa rete / il grafico:

  • HueSaturationMonitor osserva due osservabili e il suo comportamento dipende dai valori combinati di entrambi gli osservabili. La maggior parte delle altre domande ha osservatori che osservano solo una cosa o in cui i valori dei due osservabili non devono essere combinati.
  • Il grafico diretto con cui abbiamo a che fare è aciclico, MA se ignori la direzione, diventa ciclico. Questo fa parte della sfida in questa domanda. Il grafico diretto rappresenta un insieme parzialmente ordinato, ma non un albero.
  • Il grafico diretto contiene catene dirette con lunghezza > 1, il che significa che esiste una dipendenza a due livelli. Per esempio. HSM osserva HS osserva CM.

Alcune di queste caratteristiche appaiono anche in altre domande, ma è la loro combinazione che è rilevante e che causa il problema che voglio risolvere.

    
posta donquixote 21.04.2014 - 20:58
fonte

0 risposte

Leggi altre domande sui tag