Diferença entre Observer, Pub / Sub e Data Binding

163

Qual é a diferença entre o Padrão do Observador , Publicar / Assinar e Vinculação de Dados ?

Pesquisei um pouco no Stack Overflow e não encontrei boas respostas.

O que eu acredito é que a ligação de dados é um termo genérico e existem diferentes maneiras de implementá-la, como o Padrão do Observador ou o padrão Pub / Sub. Com o padrão Observador, um Observável atualiza seus Observadores. Com Pub / Sub, 0 e muitos editores podem publicar mensagens de determinadas classes e 0 e muitos assinantes podem assinar mensagens de determinadas classes.

Existem outros padrões de implementação de "ligação de dados"?

Jess
fonte
Encontrei outro: checagem suja, que é o que o Angular.js faz. Mais informações aqui: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Respostas:

143

Aqui está a minha opinião sobre os três:

Ligação de dados

Essencialmente, no núcleo, isso significa apenas "o valor da propriedade X no objeto Y é semanticamente ligado ao valor da propriedade A no objeto B. Não são feitas suposições sobre como Y sabe ou é alimentado alterações no objeto B.

Observador ou Observável / Observador

Um padrão de design pelo qual um objeto é imbuído da capacidade de notificar outros sobre eventos específicos - normalmente feito usando eventos reais, que são como slots no objeto com a forma de uma função / método específico. O observável é quem fornece notificações e o observador recebe essas notificações. No .net, o observável pode expor um evento e o observador assina esse evento com um gancho em forma de "manipulador de eventos". Nenhuma suposição é feita sobre o mecanismo específico em que as notificações ocorrem, nem sobre o número de observadores que um observável pode notificar.

Pub / Sub

Outro nome (talvez com mais semântica de "transmissão") do padrão Observable / Observer, que geralmente implica um sabor mais "dinâmico" - os observadores podem assinar ou cancelar a assinatura de notificações e um observável pode "gritar" para vários observadores. No .NET, é possível usar os eventos padrão para isso, já que os eventos são uma forma de MulticastDelegate e, portanto, podem oferecer suporte a entrega de eventos para vários assinantes, além de oferecer suporte à cancelamento de assinatura. Pub / Sub tem um significado ligeiramente diferente em certos contextos, geralmente envolvendo mais "anonimato" entre evento e evento, o que pode ser facilitado por qualquer número de abstrações, geralmente envolvendo algum "intermediário" (como uma fila de mensagens) que conhece tudo partes, mas as partes individuais não se conhecem.

Ligação de dados, Redux

Em muitos padrões "do tipo MVC", o observável expõe algum tipo de "notificação de alteração de propriedade" que também contém informações sobre a propriedade específica alterada. O observador está implícito, geralmente criado pela estrutura, e assina essas notificações por meio de alguma sintaxe de ligação para identificar especificamente um objeto e propriedade, e o "manipulador de eventos" apenas copia o novo valor, potencialmente acionando qualquer lógica de atualização ou atualização.

Ligação de dados re Redux

Uma implementação alternativa para ligação de dados? Ok, aqui está uma pergunta estúpida:

  • é iniciado um encadeamento em segundo plano que verifica constantemente a propriedade vinculada em um objeto.
  • se esse encadeamento detectar que o valor da propriedade foi alterado desde a última verificação, copie o valor para o item vinculado.
JerKimball
fonte
Agradeço sua resposta e tento implementar uma ideia diferente de ligação de dados.
21413 Jess
jessemon heh, não há problema; o padrão de observador é definitivamente a abordagem "abstratamente melhor" que eu conheço, mas meu pequeno exemplo horrível também "vincularia dados", embora de maneira caótica e ineficiente.
JerKimball
7
Honestamente, eu estou cansado de ouvir "pub / sub, também conhecido como padrão de observador", eles não são a mesma coisa. Pub / sub é um sistema de eventos, o padrão observador usa um sistema de eventos para publicar eventos AUTOMATICAMENTE na alteração do objeto. Se você estiver emitindo eventos manualmente sempre que alterar um objeto, não estará usando o padrão observador.
BT
154

Há duas diferenças principais entre os padrões Observador / Observável e Publicador / Assinante:

  1. O padrão Observador / Observável é implementado principalmente de maneira síncrona , ou seja, o observável chama o método apropriado de todos os seus observadores quando algum evento ocorre. O padrão Publicador / Assinante é implementado principalmente de maneira assíncrona (usando a fila de mensagens).

  2. No padrão Observador / Observável , os observadores estão cientes do observável . Enquanto no Publisher / Subscriber , editores e assinantes não precisam se conhecer . Eles simplesmente se comunicam com a ajuda das filas de mensagens.

Como você mencionou corretamente, a ligação de dados é um termo genérico e pode ser implementado usando o método Observer / Observable ou Publisher / Subscriber. Os dados são o Publicador / Assinante.

Param
fonte
7
Eu estava lendo JavaScript Web Applications por O'Reilly ( shop.oreilly.com/product/0636920018421.do ). No capítulo 2, Alex implementa um pub/subevento JS usando. É um tipo de implementação de retorno de chamada, mas é um exemplo síncrono .
21814 Jess
5
Não li o livro, mas se ele fosse implementado usando JS "events", seria assíncrono, pois os eventos são assíncronos por definição.
Param
3
Oi Jess, é claro que você está certo. Não existe uma definição padrão para esses termos 😊
Param
14
Geralmente, um observável tem uma lista de observadores (itera sobre essa lista para enviar um evento para todos eles). Um editor geralmente está ciente de apenas uma fila em que publica seus eventos / mensagens. Ele não sabe quantos consumidores se inscreveram nessa fila.
Param
7
Para mim, esta é a diferença crucial entre os dois: Além disso, no padrão dos observadores, os observadores estão cientes do observável. Considerando que, no Pub / Sub, nem os editores nem os consumidores precisam se conhecer. Eles simplesmente se comunicam com a ajuda das filas de mensagens. Ótima resposta!
Maryisdead 22/07/2015
23

Estou um pouco divertido que todas as respostas aqui estejam tentando explicar a diferença sutil entre os padrões Observer e Pub / Sub sem dar exemplos concretos. Aposto que a maioria dos leitores ainda não sabe como implementar cada um lendo um é síncrono e o outro é assíncrono.

Uma coisa a observar é: O objetivo desses padrões é tentar desacoplar o código

O Observer é um padrão de design em que um objeto (conhecido como assunto) mantém uma lista de objetos dependendo dele (observadores), notificando-os automaticamente sobre qualquer alteração no estado.

Padrão de observador

Isso significa que um observable objecttem uma lista onde ele mantém todos os seus observers(que geralmente são funções). e pode percorrer esta lista e invocar essas funções quando for uma boa hora.

veja este exemplo de padrão de observador para obter detalhes.

Esse padrão é bom quando você deseja ouvir qualquer alteração de dados em um objeto e atualizar outras visualizações da interface do usuário de forma correspondente.

Mas os Contras são Observáveis ​​mantêm apenas uma matriz para manter os observadores (no exemplo, a matriz é observersList).

NÃO diferencia como a atualização é acionada porque ela possui apenas uma notify function, que aciona todas as funções armazenadas nessa matriz.

Se queremos agrupar manipuladores de observadores com base em diferentes eventos. Nós só precisamos modificar isso observersListpara um Objectgosto

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

veja este exemplo do pubsub para obter detalhes.

e as pessoas chamam essa variação de pub/sub. Assim, você pode ativar diferentes funções com base na eventspublicação.

Qiang
fonte
Bem, esta é uma resposta muito melhor, concisa e clara. :)
CoderX
Em um nível alto, eu sempre disse que o pub sub é o padrão de observador, mas com tudo isso tem sabores diferentes.
Grim
9

Concordo com a sua conclusão sobre os dois padrões; no entanto, para mim, uso o Observable quando estou no mesmo processo e o Pub / Sub em cenários entre processos, em que todas as partes conhecem apenas o canal comum, mas não as partes. .

Não conheço outros padrões ou, digamos assim, nunca precisei de outros padrões para esta tarefa. Mesmo a maioria das estruturas MVC e implementações de ligação de dados geralmente usam internamente o conceito de observador.

Se você estiver interessado em comunicação entre processos, recomendo que você:

"Padrões de integração corporativa: projetando, construindo e implantando soluções de mensagens" - http://www.addison-wesley.de/9780321200686.html

Este livro contém muitas idéias sobre como enviar mensagens entre processos ou classes que podem ser usadas mesmo em tarefas de comunicação entre processos (isso me ajudou a programar de uma maneira mais flexível).

Eu espero que isso ajude!

Rafa
fonte