Richiamare metodi di un altro componente in Pattern osservatore

2

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 componente PagePreparator .

  • 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 di PagePreparator , ad esempio PagePreparator.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 modello Document , ad esempio updatePages che viene rilevato dagli osservatori di PagePreparator . PagePreparator quindi imposta l'output sul modello Document che viene rilevato dall'osservatore di Printer che procede a fare il suo lavoro.

  • Semplicemente "spezzando" il pattern e esponendo il metodo di PagePreparator , pagePreparator.prepare() a Printer che può quindi chiamarlo esplicitamente.

  • Invio di un evento da Printer che viene rilevato da PagePreparator che procede a impostare il valore sul modello Document , per Printer a prenderlo.

posta Nik Kyriakides 29.03.2016 - 07:55
fonte

1 risposta

1

La terza opzione mi sembra più pulita. Mi trovo spesso a fare uso del Pattern degli aggregatori di eventi con applicazioni contenenti moduli isolati / disconnessi che comunicano con ogni altri tramite messaggi (Un'altra buona pagina qui ).

Il pattern stesso è diventato comune almeno in .NET con un sacco di esempi di Aggregator di eventi" generici "attorno ai quali dovrebbe essere possibile tradurre in molte lingue.

Il vantaggio dell'uso dei messaggi per comunicare tra i moduli è che questi moduli rimangono disaccoppiati; il costo però è l'aggiunta di uno strato di riferimento indiretto.

    
risposta data 29.03.2016 - 10:24
fonte

Leggi altre domande sui tag