Questo è un vecchio post, ma ho intenzione di suonare comunque perché le altre risposte non trattano di ciò che accade quando si utilizza uno dei due schemi, sembrano essere più sulla teoria che sulla pratica.
Come funzionano la delegazione e l'osservatore
Con la delega, il delegato sceglie esattamente chi risponderà a un determinato 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 modello Observer, l'osservatore sceglie chi sta osservando ogni volta che ne ha voglia; così le dipendenze sono invertite quando si tratta di osservatore vs delegazione. Con il modello di osservatore, pensa 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 di chi si occupa di eventi specifici. I dipendenti non possono scegliere quali compiti stanno lavorando ... in generale.
Alcuni sostengono che una delegazione possa 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 gestirà l'evento fino a quando non si verificherà e il delegatore chiama un metodo pubblico su di esso.
Vantaggio di delega
Questo modello è molto rigido e con la maggior parte dei disegni regidi è più semplice e generalmente più robusto. Ti costringe a dichiarare il gestore dell'evento in anticipo al momento dell'inizializzazione della fonte del potenziale evento. Se hai bisogno di qualcuno per dirigere il traffico, assegni un direttore del traffico prima di aprire la strada. Nel caso dell'osservatore, lasci che il poliziotto del traffico scelga quando dirigere il traffico ogni volta che ne ha voglia.
Svantaggio della delega
Lo svantaggio di questo design è che non è flessibile. Se stai implementando un codice per abbonarti a un giornale, il giornale / delegato dovrebbe identificare esattamente chi può leggere le notizie nel momento in cui vengono create. Con il modello di osservatore possono essere registrati in un secondo momento in qualsiasi momento e il giornale dovrà solo sapere che una nuova persona si è registrata.
Quando scegliere la delegazione?
Se hai sicuramente bisogno di uno o più osservatori specifici e non hai motivo di cambiare chi sta osservando, allora il design rigido del modello di delega sarà utile.
Ad esempio, è necessaria una classe / oggetto per gestire la creazione di un popup per un errore specifico. Non ci sono molti motivi per cui in fase di esecuzione dovresti cambiare chi gestisce un errore specifico, quindi delegare l'errore "Memoria insufficiente" a una singola entità avrebbe senso. La creazione di una matrice di potenziali gestori e quindi la registrazione di tali gestori per l'errore "Memoria insufficiente" non avrebbe molto senso; quello sarebbe un esempio dell'uso del modello di osservatore in questa situazione. In fase di runtime potresti voler cambiare quali metodi vengono chiamati o quali "delegati" vengono chiamati per eventi variabili ma sostituire un gestore di eventi per un evento specifico in fase di runtime non è normale.
Non è impossibile scambiare i delegati come faresti nel modello di osservatore, è solo complicato. Nel mondo reale forse vuoi scambiare poliziotti in modo che un nuovo delegato stia gestendo il traffico. Si potrebbe sostenere che un design migliore renderebbe un delegato originale una stazione di polizia e non un singolo ufficiale di polizia, ma sto divagando ...