Diferencia entre observador, pub / sub y enlace de datos

163

¿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"?

Encadenar
fuente
Encontré otro: comprobación sucia, que es lo que hace Angular.js. Más información aquí: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Respuestas:

143

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:

  • Se inicia un subproceso en segundo plano que comprueba constantemente la propiedad vinculada en un objeto.
  • si ese hilo detecta que el valor de la propiedad ha cambiado desde la última verificación, copie el valor en el elemento vinculado.
JerKimball
fuente
Agradezco su respuesta e intento implementar una idea diferente de enlace de datos.
Jess
@jessemon heh, no hay problema; el patrón del observador es definitivamente el enfoque "abstracto mejor" que conozco, pero mi pequeño y horrible ejemplo también "vincularía datos", aunque de manera caótica e ineficiente.
JerKimball
77
Honestamente, estoy cansado de escuchar "pub / sub, también conocido como el patrón de observación", no son para nada lo mismo. Pub / sub es un sistema de eventos, el patrón de observación utiliza un sistema de eventos para publicar eventos AUTOMÁTICAMENTE al cambiar el objeto. Si está emitiendo eventos manualmente cada vez que cambia un objeto, no está utilizando el patrón de observación.
BT
154

Existen dos diferencias principales entre los patrones de observador / observable y editor / suscriptor:

  1. 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).

  2. 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.

Param
fuente
77
Estaba leyendo aplicaciones web JavaScript de O'Reilly ( shop.oreilly.com/product/0636920018421.do ). En el Capítulo 2, Alex implementa un pub/subuso de eventos JS. Es un tipo de implementación de devolución de llamada, pero es un ejemplo sincrónico .
Jess
55
No he leído el libro, pero si se implementó utilizando "eventos" de JS, sería asíncrono ya que los eventos son asíncronos por definición.
Param
3
Hola Jess, por supuesto que tienes razón. No hay una definición estándar para estos términos 😊
Param
14
En general, un observable tiene una lista de observadores (itera sobre esta lista para enviar un evento a todos ellos). Un editor generalmente solo conoce una cola donde publica sus eventos / mensajes. No sabe cuántos consumidores se han suscrito a esa cola.
Param
77
Para mí, esta es la diferencia crucial entre los dos: también, en el patrón de observador, los observadores son conscientes de lo observable. Mientras que, en Pub / Sub, ni los editores, ni los consumidores necesitan conocerse. Simplemente se comunican con la ayuda de colas de mensajes. ¡Gran respuesta!
maryisdead
23

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

El observador es un patrón de diseño en el que un objeto (conocido como sujeto) mantiene una lista de objetos que dependen de él (observadores), notificándoles automáticamente cualquier cambio de estado.

Patrón de observador

Esto significa que observable objecttiene una lista donde guarda todas sus observersfunciones (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 observersLista un me Objectgusta

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

vea 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 lo eventsque haya publicado.

Qiang
fuente
Bueno, esta es una respuesta mucho mejor, concisa y clara. :)
CoderX
En un nivel alto, siempre he dicho que el sub pub es el patrón de observación pero con todo tiene diferentes sabores.
Grim
9

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!

Rafa
fuente