Este é um post antigo, mas eu vou gritar de qualquer maneira, porque as outras respostas não lidam com o que está acontecendo ao usar um ou outro padrão, elas parecem ser mais sobre teoria do que prática.
Como funcionam as delegações e os observadores
Com a delegação, o delegador escolhe exatamente quem responderá a um evento específico no momento em que a fonte do evento potencial for criada. Você pode pensar nesse ouvinte como um único observador . No caso do padrão Observador, o observador escolhe quem está observando sempre que lhe apetecer; portanto, as dependências são revertidas quando se trata de observador versus delegação. Com o padrão de observador, pense em um jornal e assinantes como observadores. Os observadores estão no controle de quando o relacionamento é criado. Com a delegação, pense em um funcionário e em um empregador. O empregador está no controle de quando o relacionamento é criado e exatamente quem está encarregado de eventos específicos. Os funcionários não podem escolher em que tarefas estão trabalhando ... geralmente.
Alguns argumentam que a delegação pode ter um observador, mas acho que a diferença real entre os dois é como o tratamento de eventos é atribuído. Você nunca verá um delegado se registrar em um evento. Ele nunca saberá que está lidando com o evento até que ele aconteça e o delegador chame um método público sobre ele.
Vantagem da delegação
Esse padrão é muito rígido e, com a maioria dos projetos elegantes, é mais simples e geralmente mais robusto. Obriga você a declarar seu manipulador de eventos com antecedência no momento da inicialização da origem do evento potencial. Se você precisar de alguém para direcionar o tráfego, atribua um diretor de tráfego antes de abrir a rua. No caso do observador, você deixaria o policial escolher quando direcionar o tráfego a qualquer momento que quisesse.
Desvantagem da delegação
A desvantagem desse design é que ele não é flexível. Se você estivesse implementando algum código para assinar um jornal, o jornal / delegador precisaria identificar exatamente quem pode ler as notícias no segundo em que são criadas. Com o padrão de observador, eles podem ser registrados posteriormente a qualquer momento e o jornal precisará saber apenas que uma nova pessoa se inscreveu.
Quando escolher a delegação?
Quando você precisa de um observador específico, com certeza, e não há motivo para alterar quem está observando, o design rígido do padrão de delegação será benéfico.
Por exemplo, você precisa de uma classe / objeto para lidar com a criação de um pop-up para um erro específico. Não há muitos motivos pelos quais, em tempo de execução, você precisaria mudar quem está lidando com um erro específico; portanto, delegar o erro "Memória insuficiente" a uma única entidade faria sentido. Criar uma matriz de manipuladores em potencial e depois fazer com que esses manipuladores se registrem para o erro "Memória insuficiente" não faria muito sentido; isso seria um exemplo do uso do padrão observador nessa situação. No tempo de execução, você pode alterar os métodos chamados ou o que "delegar" é chamado para eventos variáveis, mas a troca de um manipulador de eventos por um evento específico no tempo de execução não é normal.
Não é impossível trocar delegados como você faria no padrão de observadores, é apenas complicado. No mundo real, talvez você queira trocar policiais de trânsito para que um novo delegador esteja lidando com o tráfego. Pode-se argumentar que um design melhor faria delegar original uma delegacia de polícia e não um único policial, mas eu discordo ...