Mediator vs Observer?

27

Qualcuno può fornirmi una risposta canonica sulle differenze tra Observer e Mediator e un riepilogo di quando è necessario utilizzare un modello rispetto all'altro?

Non sono sicuro di quale tipo di situazione richiederebbe un Observer e che tipo richiederebbe un Mediator

    
posta Rachel 10.02.2012 - 18:32
fonte

4 risposte

19

Nel libro originale che ha coniato i termini Observer and Mediator, Modelli di design, elementi del software orientato agli oggetti riutilizzabile dice 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 ai soggetti del modello Observer) abbiano un riferimento alla classe Mediator o all'interfaccia Mediator.

Ci sono molti casi in cui si vorrebbe usare il pattern dell'osservatore, la chiave è che sull'oggetto non si dovrebbe sapere quali altri oggetti stanno osservando il suo stato.

Il mediatore è un po 'più specifico, evita che le classi comunichino direttamente ma tramite un mediatore. Questo aiuta il principio di Responsabilità Unica, consentendo di scaricare la comunicazione in una classe che lo gestisce.

Un classico esempio di Mediator è in una GUI, dove l'approccio ingenuo potrebbe portare al codice in un evento click del pulsante che dice "se il pannello Foo è disabilitato e il pannello Bar ha un'etichetta che dice" Si prega di inserire la data ", quindi non chiamare il server, altrimenti vai avanti ", dove con il modello di Mediator si potrebbe dire" Sono solo un pulsante e non ho conoscenze sul mondo del pannello Foo e dell'etichetta sul pannello Bar, quindi chiederò al mio mediatore se chiamare il server è OK adesso. "

Oppure, se è implementato usando il pattern di osservatore, il pulsante direbbe "Ehi, osservatori (che includerebbe il mediatore), il mio stato è cambiato (qualcuno mi ha fatto clic). Nel mio esempio questo probabilmente ha meno senso, ma a volte lo farebbe, e la differenza tra Observer e Mediator sarebbe più una questione di intenti che una differenza nel codice stesso.

    
risposta data 10.02.2012 - 19:14
fonte
9

Il pattern Observer funziona bene quando non è necessaria alcuna coordinazione tra gli osservatori e la relazione osserva va in un modo.

Ad esempio, lascia che gli oggetti B e C osservino l'oggetto A. Quando l'oggetto A attiva l'evento X, l'oggetto B deve eseguire il metodo Y () e l'oggetto C deve eseguire il metodo Z (). Se i metodi B.Y () e C.Z () sono totalmente indipendenti e non richiedono alcuna coordinazione, allora vai avanti e usa il modello di osservatore.

D'altra parte, se B.Y () deve essere eseguito prima di C.Z (), allora si vorrà usare il modello di Mediatore in cui il mediatore racchiude questa coordinazione. In questo scenario, il mediatore M osserverebbe l'oggetto A e avrebbe riferimenti agli oggetti B e C. Quando A genera l'evento X, M gestirà l'evento e chiamerà B.Y () e C.Z () nell'ordine prescritto.

Inoltre, se gli oggetti A, B e C devono osservarsi a vicenda, usare un mediatore come intermediario farà molta strada per disaccoppiare questi oggetti ed evitare il codice spaghetti.

    
risposta data 10.02.2012 - 22:40
fonte
5

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

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

    
risposta data 10.02.2012 - 18:56
fonte
1

In termini semplici (che uso per ricordarlo):

Observer: utilizzare quando un oggetto vuole essere informato delle modifiche dello stato in un altro (in senso stretto, usando gli eventi è Observer)

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

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

    
risposta data 10.02.2012 - 19:59
fonte

Leggi altre domande sui tag