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