Na última vez em que estudei o modo Observer, muitos artigos disseram que ele também é chamado de Subscribe/Publish (Modo Publicar/Subscrever). Mas no livro "JavaScript Design Pattern", ainda existem algumas diferenças entre os dois padrões. As palavras originais do livro são as seguintes:
1. O modo de observador requer observadores que desejam receber notificações de tópicos devem se inscrever em eventos em que o conteúdo muda.
2.Subscribe/Publish Mode usa um canal de tema/evento, que é entre assinante e editor. O sistema de eventos permite que o código defina eventos específicos para o aplicativo, que podem passar parâmetros personalizados que contêm os valores exigidos pelo assinante. O objetivo é evitar dependências entre assinantes e editores.
A diferença do modo Observer é que ele permite que qualquer assinante execute os manipuladores de eventos apropriados para registrar e receber notificações dos editores.
OK, eu não sei como ser tão poderoso. Aqui está o meu entendimento:
1. No modo Observador, o objeto de destino é responsável por manter o observador. No modo de publicação/assinatura, os editores não se importam com assinantes, eles são responsáveis apenas por jogar mensagens e deixá -los em paz.
2. No modo Observador, o observador precisa fornecer uma interface e, em seguida, chamar essa interface quando o objeto de destino muda para manter seu próprio estado e o estado alvo consistente. Ou seja, todos os observadores devem ter uma interface unificada (por exemplo, o método de atualização escrito acima, o método de todos deve ser chamado desse nome). No modo de publicação/assinatura, o acionamento do evento de assinante não se baseia nessa interface, mas é acionado pelo assinante ouvindo uma mensagem específica (esta mensagem geralmente contém o nome e os parâmetros exigidos pelo assinante). Pode -se entender que o assinante não está ouvindo o editor, mas o pool de mensagens. Enquanto houver uma mensagem com a qual se importa no pool de mensagens, ela desencadeia o evento, não importa quem postou a mensagem no passado. Editores e assinantes são dissociados.
A seguir, é apresentada a implementação do modo de publicação/assinatura no JS. Copie e cole -o no console e você o entenderá depois de tentar:
A cópia do código é a seguinte:
var pubsub = (function () {
var q = {}
tópicos = {},
subuid = -1;
// Publique uma mensagem
q.publish = function (tópico, args) {
if (! Tópicos [tópico]) {return;}
var subs = tópicos [tópico],
len = subs.length;
while (len--) {
subs [len] .func (tópico, args);
}
devolver isso;
};
// assina eventos
q.subScribe = function (tópico, func) {
Tópicos [Tópico] = Tópicos [Tópico]? Tópicos [tópico]: [];
var token = (++ subuid) .ToString ();
Tópicos [tópico] .push ({
Token: Token,
FUNC: func
});
Token de retorno;
};
retornar q;
// Descubra e pare de escrever, travesse tópicos e depois retorne o token salvando o anterior, exclua o elemento especificado
}) ();
// Evento desencadeado
var logmsg = função (tópicos, dados) {
console.log ("Logging:" + tópicos + ":" + dados);
}
// Ouça a mensagem especificada 'msgname'
var sub = pubsub.subscribe ('msgname', logmsg);
// postou uma mensagem 'msgname'
pubsub.publish ('msgname', 'hello world');
// postou uma mensagem não listada 'msgname1'
pubsub.publish ('Othermsgname', 'eu também!');