No padrão de delegação , apenas um objeto pode ouvir diretamente os eventos de outro objeto. No padrão observador , qualquer número de objetos pode ouvir os eventos de um objeto específico. Ao projetar uma classe que precisa notificar outros objetos de eventos, por que você usaria o padrão delegado sobre o padrão observador? Eu vejo o padrão de observador como mais flexível. Você pode ter apenas um observador agora, mas um design futuro pode exigir vários observadores.
9
Respostas:
Não há padrão de delegado em si. Eu vou assumir que você quer dizer Padrão de Delegação .
Pelo que entendi, eles são o inverso completo um do outro e usados para diferentes propósitos.
Geralmente, com um Padrão de observador , qualquer número de objetos de observador escutará um evento em um segundo objeto e atuará no evento. O segundo objeto não tem conhecimento de seus ouvintes. Apenas chama por eles.
Um objeto delegado é passado para o segundo objeto que chama métodos diretamente no delegado. E aí está a vantagem que você está procurando. Em vez de enviar uma única mensagem para vários ouvintes, ele tem controle total sobre um único objeto (em um determinado momento). Veja também Inversão de controle .
fonte
Você está olhando as coisas incorretamente. Um observador vê que um evento específico ocorre. Não afeta, nem possui. Um delegado lida com um evento específico e possui a propriedade do manipulador, mesmo se o delegador possuir a interface para o evento.
fonte
Essa é uma questão de várias compensações.
Trade-offs:
Delegar padrão:
Padrão de observador:
fonte
O padrão delegado, como eu o entendo, é conhecido como o mecanismo do manipulador de eventos em outros idiomas, como o Delphi. Como tal, é simplesmente uma implementação do padrão de observador com uma restrição importante: apenas um ouvinte de cada vez.
A desvantagem dos manipuladores ou delegados de eventos é óbvia: apenas um observador.
A vantagem não é tão óbvia: desempenho. Com um padrão de observador, você pode adicionar muitos observadores. Quando ocorre um evento sobre o qual os observadores precisam ser notificados, você precisará enumerar os observadores e enviar uma notificação para cada um. Isso pode atolar rapidamente qualquer instância observada, especialmente quando o número de eventos que exigem notificação também é significativo.
fonte
int (*my_int_f)(int)
em C). Eu sempre pensei que eles teriam facilitado a compreensão, fazendo com que funcionasse mais como struct / enum. Um evento é um gancho para uma matriz flexível de ouvintes, usando uma única assinatura de delegado. Você poderia fazer isso sem um evento (e é por isso que eu suponho que o OP significava Padrão de Delegação, que é muito diferente), mas o idioma está facilitando para você.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 ...
fonte