Domanda:
- Esistono tecniche per comunicare con metodi di altri componenti, ma mantengono ancora un modello di Osservatore "puro"?
- Se sì, sono indicati / regolarmente utilizzati o sto solo complicando le cose?
Un esempio pratico
Supponiamo che abbia un'architettura con le seguenti caratteristiche:
- System è un'app Word Processor
- Molti componenti, ciascuno con il proprio scopo, ad esempio
KeypressDetector
,Printer
,DocumentRenderer
. - I componenti modificano / osservano un singolo modello, il
Document
- I componenti così "comunicano" tramite questa osservazione / modifica del modello. I componenti non si conoscono l'un l'altro in nessun altro modo.
Se non sbaglio, questo è ciò che è il modello di osservatore .
Quindi ecco un caso in cui c'è un problema:
-
Per il componente
Printer
per eseguire il suo lavoro ha bisogno di un output dal componentePagePreparator
. -
Questo è solo un caso limite in cui il componente
PagePreparator
non può aggiornare continuamente il modello che è condiviso tra i componenti perché implica un calcolo pesante. Ciò riguarda solo un singolo aspetto diPagePreparator
, ad esempioPagePreparator.prepare() // takes a long time to run
.
Quindi questo è un caso in cui mi sembra che io debba "staccare" da questa pura configurazione di Observer e solo esporre il metodo di PagePreparator
a Printer
direttamente e chiamarlo esplicitamente da Printer
. Ciò li accoppia esplicitamente insieme però.
Esistono tecniche per mantenere questo modello di Osservatore esclusivamente ed essere ancora in grado di eseguire questo tipo di invocazioni?
Possibili soluzioni:
-
Quando
Printer
ha bisogno di output, imposta un flag sul modelloDocument
, ad esempioupdatePages
che viene rilevato dagli osservatori diPagePreparator
.PagePreparator
quindi imposta l'output sul modelloDocument
che viene rilevato dall'osservatore diPrinter
che procede a fare il suo lavoro. -
Semplicemente "spezzando" il pattern e esponendo il metodo di
PagePreparator
,pagePreparator.prepare()
aPrinter
che può quindi chiamarlo esplicitamente. -
Invio di un evento da
Printer
che viene rilevato daPagePreparator
che procede a impostare il valore sul modelloDocument
, perPrinter
a prenderlo.