Patrón de diseño de observador frente a "oyentes"

136

Me parece que el patrón de diseño de Observer como se describe en GOF es realmente lo mismo que los oyentes que se encuentran en varios kits de herramientas. ¿Hay alguna diferencia entre los conceptos, o los oyentes y los observadores son realmente lo mismo?

(No estoy buscando ninguna implementación específica de lenguaje de computadora, solo quiero entender la diferencia (si existe) desde el punto de vista del diseño. Sí, sé que hay varias respuestas a preguntas similares en SOF, pero están enraizadas en preguntas específicas sobre idiomas específicos: estoy buscando una respuesta de diseño, no una respuesta de idioma).

JohnnyLambada
fuente
19
En el primero, un código observa el otro código en busca de movimiento, mientras que en el segundo un código escucha el otro código en busca de cualquier ruido.
nate c
2
¿Qué significa GOF?
dekaru
55
@dekaru Gang of Four: en.wikipedia.org/wiki/Design_Patterns
bitsoflogic

Respuestas:

60

Si el término "oyente" se refiere al patrón del Observador o no, dependerá del contexto. Por ejemplo, los "Oyentes de eventos" de Java Swing son parte de una implementación de patrón de Observador, mientras que los "Oyentes de rastreo" .Net no lo son.

No es raro que los autores de marcos asignen diferentes nombres a los componentes que participan en una implementación de patrón dada, pero los nombres de patrones oficiales generalmente se usan cuando se discuten los patrones en sí.

Con respecto al diseño, la implementación de un patrón dado a menudo estará influenciada por el lenguaje y la plataforma que se utilice. Como tal, una implementación particular del patrón Observador dentro de un marco dado (que puede usar el término "oyente" para describir el papel del Observador concreto) puede diferir ligeramente de la descrita en el libro Patrones de diseño.

Derek Greer
fuente
26

Hay una naturaleza bidireccional en la descripción de Observer in Design Patterns por Gamma et. Alabama. (GoF).

En su descripción de Observer, uno de los ConcreteObservers podría indicar un cambio en su Asunto. El Asunto, que contiene una lista de todos los Observadores concretos, luego notifica su lista. Todos los observadores de hormigón, incluido el motor principal, reaccionan según corresponda.

Las implementaciones comunes de los oyentes parecen reaccionar a los eventos externos.

Entonces, diría que el oyente es un caso menos generalizado de un observador.

Richard Wеrеzaк
fuente
4

Un oyente puede ser una implementación del patrón de observador. Un oyente esencialmente está esperando que ocurra un evento en un objeto dado, que es lo que hace un observador.

Sé que no buscas una respuesta específica del idioma, pero es un poco difícil hablar sobre esto en abstracto. Entonces, si tuviera que investigar esto en .NET, me inclinaría a abrir un ensamblaje que contenga un oyente en .NET Reflector, lo que me permitirá desmontar el ensamblaje y verificar su lógica contra un patrón de diseño.

Miguel
fuente