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.