Mediatore vs osservatore?


27

Qualcuno può fornirmi una risposta canonica sulle differenze tra una Observere una Mediatore un riepilogo di quando dovresti usare un modello rispetto all'altro?

Non sono sicuro di quale tipo di situazione richiederebbe un Observertipo e quale tipo richiederebbe unMediator


Mi piacerebbe sapere la tua idea al riguardo dopo 7 anni?
Niing

Risposte:


19

Nel libro originale che coniò i termini osservatore e mediatore, schemi di progettazione, elementi di software orientato agli oggetti riutilizzabili, si afferma che il modello di mediatore può essere implementato usando il modello di osservatore. Tuttavia, può anche essere implementato facendo in modo che i colleghi (approssimativamente equivalenti al modello Soggetti dell'osservatore) abbiano un riferimento a una classe di mediatore o a un'interfaccia di mediatore.

Ci sono molti casi in cui vorresti usare il modello di osservatore, la loro chiave è che sull'oggetto non dovrebbe sapere quali altri oggetti stanno osservando il suo stato.

Il mediatore è un po 'più specifico, evita che le classi comunichino direttamente ma invece attraverso un mediatore. Ciò aiuta il principio della responsabilità singola consentendo di scaricare la comunicazione in una classe che la gestisce.

Un classico esempio di Mediatore è in una GUI, in cui l'approccio ingenuo potrebbe portare al codice su un evento clic sul pulsante che dice "se il pannello Foo è disabilitato e il pannello Bar ha un'etichetta che dice" Inserisci la data ", quindi non chiamare il server, altrimenti andare avanti ", dove con il modello del mediatore si potrebbe dire" Sono solo un pulsante e non ho affari terrestri a conoscenza del pannello Foo e dell'etichetta sul pannello Bar, quindi chiederò al mio mediatore se si chiama il server va bene adesso ".

Oppure, se è implementato usando il modello di osservatore, il pulsante direbbe "Ehi, osservatori (che includerebbe il mediatore), il mio stato è cambiato (qualcuno mi ha cliccato). Fai qualcosa al riguardo se ti interessa". Nel mio esempio questo probabilmente ha meno senso, ma a volte lo sarebbe, e la differenza tra Observer e Mediatore sarebbe più un intento che una differenza nel codice stesso.


Grazie, i tuoi esempi mi hanno davvero aiutato a chiarire le differenze tra i due per me. Se ho capito bene, il modello di osservatore utilizza un sistema di abbonamento / trasmissione di messaggi per la comunicazione, mentre il mediatore è come un'entità accessibile a livello globale che gli oggetti possono richiedere informazioni.
Rachel,

@ Rachel - Descriverei l'osservatore come hai fatto tu. Il mediatore probabilmente non è globale, ma è noto a tutti gli oggetti nell'insieme che sarebbero stati in comunicazione tra loro ma ora passano attraverso il mediatore. A meno che il mediatore non sia implementato come osservatore, nel qual caso conosce tutti quegli oggetti (almeno attraverso la loro interfaccia osservabile, forse direttamente) ma loro non lo sanno.
psr

9

Il modello Observer funziona bene quando non è necessario alcun coordinamento tra gli osservatori e la relazione degli osservatori procede in un modo.

Ad esempio, lasciare che gli oggetti B e C osservino l'oggetto A. Quando l'oggetto A genera l'evento X, l'oggetto B dovrebbe eseguire il metodo Y () e l'oggetto C dovrebbe eseguire il metodo Z (). Se i metodi BY () e CZ () sono totalmente indipendenti e non richiedono alcun coordinamento, andare avanti e utilizzare il modello di osservatore.

D'altra parte, se BY () deve essere eseguito prima di CZ (), sarà necessario utilizzare il modello Mediatore in cui il mediatore incapsula questa coordinazione. In questo scenario, il mediatore M osserverebbe l'oggetto A e avrebbe riferimenti agli oggetti B e C. Quando A lancia l'evento X, M gestirà l'evento e chiamerà BY () e CZ () nell'ordine prescritto.

Inoltre, se gli oggetti A, B e C devono osservarsi l'un l'altro, l'uso di un mediatore come intermediario farà molto per disaccoppiare questi oggetti ed evitare il codice spaghetti.


5

Il Observermodello viene utilizzato quando un'azione intrapresa su una classe (la classe osservata) deve produrre una reazione in un'altra classe (la classe osservante) ma non è desiderabile che la classe osservata sia accoppiata alla classe osservante. Questo è un modello molto comune. Il parser XML SAX può essere un buon esempio. Per utilizzare il parser SAX, un client implementa l' ContentHandlerinterfaccia per "osservare" l'operazione del parser. Quando il parser incontra elementi del documento XML, chiama i metodi di ContentHandler. Il parser è in grado di invocare il codice client, ma il parser non è accoppiato al codice client.

Il Mediatormodello è un incapsulamento di un modello di utilizzo di un insieme di oggetti. Il codice cliente viene accoppiato solo al mediatore, anziché essere accoppiato a più altre classi. È simile all'aggregazione, tranne che la durata degli oggetti incapsulati è indipendente dalla durata del mediatore.


1

In termini semplici (che uso per ricordarlo):

Observer: utilizzare quando un oggetto desidera essere informato dei cambiamenti di stato in un altro (in senso stretto, l'utilizzo degli eventi è Observer)

Per capire il mediatore, trovo più semplice se si considera prima Facade: Facade aggrega la funzionalità di classi separate (a volte interi sottosistemi) e fornisce tale funzionalità in un'unica interfaccia.

Mediatore: uguale alla facciata, tranne per il fatto che combina la funzionalità di tutte le classi aggregate per produrre nuove funzionalità. (Buona spiegazione qui )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.