Padrão de design do observador vs "ouvintes"

136

Parece-me que o padrão de design do Observer, conforme descrito no GOF, é realmente a mesma coisa que os Listeners encontrados em vários kits de ferramentas. Existe uma diferença entre os conceitos ou os ouvintes e os observadores são realmente a mesma coisa.

(Não estou procurando nenhuma implementação específica de linguagem de computador, só quero entender a diferença (se houver) do ponto de vista do design. Sim, eu sei que existem várias respostas para perguntas semelhantes no SOF, mas elas estão enraizadas em perguntas específicas sobre idiomas específicos - estou procurando uma resposta de design, não uma resposta de idioma.)

JohnnyLambada
fonte
19
No primeiro, um código observa o outro código para movimento, enquanto no último um código ouve o outro código em busca de qualquer ruído.
N / a c
2
GOF de quê?
dekaru
5
@dekaru Gangue dos Quatro: en.wikipedia.org/wiki/Design_Patterns
bitsoflogic

Respostas:

60

Se o termo "ouvinte" se refere ao padrão Observador ou não, dependerá do contexto. Por exemplo, os "Listeners de Eventos" do Java Swing fazem parte de uma implementação do padrão Observer, enquanto os "Listeners de Rastreamento" .Net não são.

Não é incomum os autores de estrutura atribuírem nomes diferentes aos componentes que participam de uma determinada implementação de padrão, mas os nomes oficiais de padrão geralmente são usados ​​ao discutir os próprios padrões.

No que diz respeito ao design, a implementação de um determinado padrão geralmente será influenciada pelo idioma e pela plataforma que está sendo usada. Dessa forma, uma implementação específica do padrão Observer em uma determinada estrutura (que pode usar o termo "listener" para descrever o papel do ConcreteObserver) pode diferir um pouco da descrita no livro Design Patterns.

Derek Greer
fonte
26

Existe uma natureza de mão dupla na descrição do Observer in Design Patterns de Gamma et. al. (GoF).

Na descrição do Observer, um dos Observadores de Concreto pode sinalizar uma alteração em seu Assunto. O Assunto, que contém uma lista de todos os ConcreteObservers, notifica sua lista. Todos os observadores de concreto, incluindo o motor primário, reagem conforme apropriado.

As implementações comuns dos ouvintes parecem reagir a eventos externos.

Então, eu diria que o ouvinte é um caso menos generalizado de um observador.

Richard Wеrеzaк
fonte
4

Um ouvinte pode muito bem ser uma implementação do padrão observador. Um ouvinte está essencialmente esperando que um evento ocorra em um determinado objeto, que é o que um observador faz.

Eu sei que você não está procurando uma resposta específica para o idioma, mas é meio difícil falar sobre isso no resumo. Portanto, se eu fosse investigar isso no .NET, estaria inclinado a abrir um assembly contendo um ouvinte no .NET Reflector, o que me permitirá desmontar o assembly e verificar sua lógica em relação a um padrão de design.

Mike
fonte