¿Cuál es la diferencia entre el patrón de observador , publicación / suscripción y enlace de datos ?
Busqué un poco en Stack Overflow y no encontré ninguna buena respuesta.
Lo que he llegado a creer es que el enlace de datos es un término genérico y hay diferentes formas de implementarlo, como el Patrón de observador o el patrón Pub / Sub. Con el patrón Observador, un Observable actualiza sus Observadores. Con Pub / Sub, 0-muchos editores pueden publicar mensajes de ciertas clases y 0-muchos suscriptores pueden suscribirse a mensajes de ciertas clases.
¿Existen otros patrones de implementación del "enlace de datos"?
Respuestas:
Aquí está mi opinión sobre los tres:
El enlace de datos
Esencialmente, en el fondo esto solo significa que "el valor de la propiedad X en el objeto Y está semánticamente unido al valor de la propiedad A en el objeto B. No se hacen suposiciones sobre cómo Y sabe o se alimenta los cambios en el objeto B.
Observador u observable / observador
Un patrón de diseño mediante el cual un objeto está imbuido de la capacidad de notificar a otros sobre eventos específicos, generalmente realizado mediante eventos reales, que son como ranuras similares en el objeto con la forma de una función / método específico. El observable es el que proporciona notificaciones, y el observador recibe esas notificaciones. En .net, el observable puede exponer un evento y el observador se suscribe a ese evento con un gancho en forma de "controlador de eventos". No se hacen suposiciones sobre el mecanismo específico de las notificaciones, ni sobre el número de observadores que un observable puede notificar.
Pub / Sub
Otro nombre (quizás con más semántica de "transmisión") del patrón Observable / Observador, que generalmente implica un sabor más "dinámico": los observadores pueden suscribirse o darse de baja a las notificaciones y un observable puede "gritar" a múltiples observadores. En .NET, uno puede usar los eventos estándar para esto, ya que los eventos son una forma de MulticastDelegate y, por lo tanto, pueden admitir la entrega de eventos a múltiples suscriptores y también dar de baja la suscripción. Pub / Sub tiene un significado ligeramente diferente en ciertos contextos, que generalmente implica más "anonimato" entre el evento y el evento, lo que puede ser facilitado por cualquier cantidad de abstracciones, que generalmente involucran a algún "intermediario" (como una cola de mensajes) que sabe todo fiestas, pero las partes individuales no se conocen entre sí.
Enlace de datos, Redux
En muchos patrones "similares a MVC", el observable expone algún tipo de "notificación de cambio de propiedad" que también contiene información sobre el cambio específico de propiedad. El observador es implícito, generalmente creado por el marco, y se suscribe a estas notificaciones a través de una sintaxis de enlace para identificar específicamente un objeto y una propiedad, y el "controlador de eventos" simplemente copia el nuevo valor, lo que posiblemente desencadene cualquier actualización o lógica de actualización.
Enlace de datos re Redux
¿Una implementación alternativa para el enlace de datos? Ok, aquí hay una estúpida:
fuente
Existen dos diferencias principales entre los patrones de observador / observable y editor / suscriptor:
El patrón observador / observable se implementa principalmente de forma sincrónica , es decir, el observable llama al método apropiado de todos sus observadores cuando ocurre algún evento. El patrón de editor / suscriptor se implementa principalmente de forma asincrónica (usando la cola de mensajes).
En el patrón Observador / Observable , los observadores son conscientes de lo observable . Mientras que, en Editor / Suscriptor , los editores y suscriptores no necesitan conocerse entre sí . Simplemente se comunican con la ayuda de colas de mensajes.
Como mencionó correctamente, el enlace de datos es un término genérico y puede implementarse utilizando el método Observador / Observable o Editor / Suscriptor. Los datos son el editor / suscriptor.
fuente
pub/sub
uso de eventos JS. Es un tipo de implementación de devolución de llamada, pero es un ejemplo sincrónico .Me divierte un poco que todas las respuestas aquí intentaran explicar la sutil diferencia entre los patrones de Observer y Pub / Sub sin dar ningún ejemplo concreto. Apuesto a que la mayoría de los lectores aún no saben cómo implementar cada uno al leer que uno es sincrónico y el otro es asíncrono.
Una cosa a tener en cuenta es: el objetivo de estos patrones es tratar de desacoplar el código
Esto significa que
observable object
tiene una lista donde guarda todas susobservers
funciones (que generalmente son funciones). y puede recorrer esta lista e invocar estas funciones cuando se siente bien.vea este ejemplo de patrón de observador para más detalles.
Este patrón es bueno cuando desea escuchar cualquier cambio de datos en un objeto y actualizar otras vistas de la IU correspondientemente.
Pero los Contras son Observables solo mantienen una matriz para mantener observadores (en el ejemplo, la matriz es
observersList
).NO diferencia cómo se activa la actualización porque solo tiene una
notify function
, que activa todas las funciones almacenadas en esa matriz.Si queremos agrupar manejadores de observadores basados en diferentes eventos. Solo necesitamos modificar eso
observersList
a un meObject
gustavea este ejemplo de pubsub para más detalles.
y la gente llama a esta variación como
pub/sub
. Por lo tanto, puede activar diferentes funciones según loevents
que haya publicado.fuente
Estoy de acuerdo con su conclusión sobre ambos patrones, sin embargo, para mí, uso Observable cuando estoy en el mismo proceso y uso Pub / Sub en escenarios entre procesos, donde todas las partes solo conocen el canal común pero no las partes .
No conozco otros patrones, o déjame decirte de esta manera, nunca he necesitado otros patrones para esta tarea. Incluso la mayoría de los marcos MVC y las implementaciones de enlace de datos utilizan generalmente internamente el concepto de observador.
Si está interesado en la comunicación entre procesos, le recomiendo:
"Patrones de integración empresarial: diseño, construcción e implementación de soluciones de mensajería" - http://www.addison-wesley.de/9780321200686.html
Este libro contiene muchas ideas sobre cómo enviar mensajes entre procesos o clases que pueden usarse incluso en tareas de comunicación dentro del proceso (me ayudó a programar de una manera más flexible).
¡Espero que esto ayude!
fuente