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"?
Respostas:
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:
fonte
Há duas diferenças principais entre os padrões Observador / Observável e Publicador / Assinante:
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).
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.
fonte
pub/sub
evento JS usando. É um tipo de implementação de retorno de chamada, mas é um exemplo síncrono .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
Isso significa que um
observable object
tem uma lista onde ele mantém todos os seusobservers
(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
observersList
para umObject
gostoveja 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 naevents
publicação.fonte
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!
fonte