Quali sono i vantaggi del modello delegato sul modello di osservatore?

9

Nel modello di delegato , solo un oggetto può ascoltare direttamente gli eventi di un altro oggetto. Nel modello di osservatore , qualsiasi numero di oggetti può ascoltare gli eventi di un particolare oggetto. Quando si progetta una classe che ha bisogno di notificare altri oggetti (o oggetti), perché dovresti mai usare lo schema delegato sul modello di osservatore? Vedo lo schema dell'osservatore più flessibile. Potresti avere un solo osservatore ora, ma un progetto futuro potrebbe richiedere più osservatori.

    
posta JoJo 02.12.2012 - 01:06
fonte

5 risposte

6

Stai guardando le cose in modo errato. Un osservatore vede che si verifica un evento particolare. Non influisce su di esso, né lo possiede. Un delegato gestisce un particolare evento e ha la proprietà del gestore, anche se il delegante possiede l'interfaccia per l'evento.

    
risposta data 02.12.2012 - 01:14
fonte
6

Non esiste un modello delegato di per sé. Presumo che tu intenda il Pattern di delega .

A quanto ho capito, sono il contrario l'uno dell'altro e usati per scopi diversi.

Generalmente, con un Pattern osservatore , qualsiasi numero di oggetti observer ascolterà un evento su un secondo oggetto e agire sull'evento. Il secondo oggetto non ha conoscenza dei suoi ascoltatori. Li chiama semplicemente.

Un oggetto delegato viene passato al secondo oggetto che chiama i metodi direttamente sul delegato. E qui sta il vantaggio che stai cercando. Piuttosto che inviare un singolo messaggio a più listener, ha il controllo completo su un singolo oggetto (in un dato momento). Vedi anche Inversion of Control .

    
risposta data 02.12.2012 - 01:27
fonte
4

Questa è una questione di diversi compromessi.

Compensi:

  • flessibilità (in termini di avere n > 1 delegati / osservatori)
  • costo di invio di un messaggio
  • resilienza (capacità di sostenere l'indisponibilità di delegati / osservatori)
  • facilità d'uso

Modello delegato:

  • non molto flessibile - l'aggiunta di più di 1 delegato non è possibile (implica qualche forma di "multi-delegato", cioè un modello di osservatore)
  • l'invio di un messaggio è economico, O (1) - lo stesso costo che chiama qualsiasi altra funzione o metodo (nessuna ricerca, coda di messaggi o altra infrastruttura richiesta)
  • solitamente non è resiliente - ci si aspetta che i delegati siano presenti e facciano la loro parte del lavoro, cioè il mittente tende a fallire se non è noto un delegato
  • facile da comprendere, facile da implementare

Modello osservatore:

  • molto flessibile - aggiungendo n > 1 osservatori sono previsti dal progetto
  • l'invio di un messaggio ha un costo implicito dal numero di osservatori, O (n), cioè n osservatori prendono tempo e messaggi (almeno in un'implementazione ingenua)
  • solitamente resiliente - generalmente non ci si aspetta che gli osservatori facciano qualsiasi lavoro su parte del mittente. Questo è anche se non c'è osservatore il mittente non è influenzato
  • può diventare piuttosto complesso da cogliere, in particolare si prevede che gli osservatori reagiscano ai messaggi (l'ordine è importante ?, quale osservatore risponde in che modo?)
risposta data 02.12.2012 - 14:30
fonte
1

Lo schema dei delegati, come comprendo te, è noto come meccanismo di gestione degli eventi in altre lingue, ad esempio Delphi. In quanto tale, è semplicemente un'implementazione del modello di osservatore con una restrizione maggiore: solo un ascoltatore alla volta.

Lo svantaggio di gestori di eventi o delegati è ovvio: un solo osservatore.

Il vantaggio non è così ovvio: le prestazioni. Con un pattern di osservatore puoi aggiungere molti osservatori. Quando si verifica un evento a cui gli osservatori devono essere informati, è necessario enumerare gli osservatori e inviare una notifica a ciascuno di essi. Ciò può rapidamente impantanare qualsiasi istanza osservata, specialmente quando il numero di eventi che richiedono la notifica è altrettanto significativo.

    
risposta data 02.12.2012 - 10:47
fonte
1

Questo è un vecchio post, ma ho intenzione di suonare in ogni caso perché le altre risposte non riguardano ciò che accade quando si usano entrambi i pattern, sembrano essere più sulla teoria che sulla pratica.

Funzionamento della delegazione e dell'osservatore

Con Delega il delegante sceglie esattamente chi risponderà a un particolare evento nel momento in cui viene creata la fonte del potenziale evento. Potresti pensare a questo ascoltatore come a un singolo osservatore . Nel caso del pattern Observer l'osservatore sceglie chi sta osservando ogni volta che ne ha voglia; quindi le dipendenze sono invertite quando si tratta di osservatore vs delega.  Con lo schema osservatore si pensi a un giornale e agli abbonati come osservatori. Gli osservatori hanno il controllo di quando viene creata la relazione. Con delega pensa a un dipendente e un datore di lavoro. Il datore di lavoro ha il controllo di quando viene creata la relazione e esattamente chi è responsabile di eventi specifici. I dipendenti non possono scegliere su quali attività stanno lavorando ... in generale.

Alcuni sostengono che la delega può avere un osservatore ma penso che la vera differenza tra i due sia il modo in cui viene assegnata la gestione degli eventi. Non vedrai mai un registro delegato per un evento. Non saprà mai che gestisce l'evento fino a quando non succede e il delegante chiama un metodo pubblico su di esso.

Vantaggio di delega

Questo modello è molto rigido e con la maggior parte dei disegni regid è più semplice e generalmente più robusto. Ti obbliga a dichiarare in anticipo il tuo gestore di eventi al momento di inizializzare la fonte del potenziale evento. Se hai bisogno di qualcuno per dirigere il traffico, assegna un direttore del traffico prima di aprire la strada. Nel caso dell'osservatore, lascia che il vigile urbano scelga quando indirizzare il traffico ogni volta che ne ha voglia.

Svantaggi della delega

Lo svantaggio di questo design è che non è flessibile. Se stavi implementando un codice per iscriversi a un giornale, il giornale / delegante dovrebbe identificare esattamente chi può leggere le notizie nel momento in cui vengono create. Con il modello di osservatori possono essere registrati in seguito in qualsiasi momento e il giornale dovrà solo sapere che una nuova persona si è iscritta.

Quando scegliere la delega?

Quando hai bisogno di uno o più osservatori specifici di sicuro e non c'è motivo per te di cambiare chi sta osservando, allora il disegno rigido del modello di delega sarà utile.

Ad esempio, hai bisogno di una classe / oggetto per gestire la creazione di un pop-up per un errore specifico. Non ci sono molte ragioni per cui in fase di esecuzione è necessario cambiare chi gestisce un errore specifico, quindi delegare l'errore "Memoria esaurita" a una singola entità avrebbe senso. La creazione di una schiera di potenziali gestori e il fatto che tali gestori si registrino per l'errore "Memoria esaurita" non avrebbe molto senso; quello sarebbe un esempio di usare il modello di osservatore in questa situazione. In fase di esecuzione potresti voler cambiare quali metodi vengono chiamati o quale "delegato" viene chiamato per gli eventi variabili, ma scambiare un gestore di eventi per un evento specifico in fase di esecuzione non è normale.

Non è impossibile scambiare delegati come faresti nel modello di osservatore, è solo complicato. Nel mondo reale, forse vuoi scambiare i vigili urbani in modo che un nuovo delegato gestisca il traffico. Si potrebbe obiettare che un design migliore renderebbe delegato originale una stazione di polizia e non un singolo agente di polizia, ma sto divagando ...

    
risposta data 06.01.2014 - 06:34
fonte

Leggi altre domande sui tag