La última vez que estudié el modo Observador, muchos artículos dijeron que también se llama suscripción/publicación (modo publicar/suscripción). Pero en el libro "Patrón de diseño de JavaScript", todavía hay algunas diferencias entre los dos patrones. Las palabras originales en el libro son las siguientes:
1. El modo Observador requiere observadores que deseen recibir notificaciones de temas deben suscribirse a eventos donde cambia el contenido.
2. El modo de sucripción/publicación utiliza un canal de tema/evento, que se encuentra entre suscriptor y editor. El sistema de eventos permite que el código defina eventos específicos para la aplicación, que pueden pasar parámetros personalizados que contienen los valores requeridos por el suscriptor. El propósito es evitar dependencias entre suscriptores y editores.
La diferencia del modo Observador es que permite que cualquier suscriptor ejecute manejadores de eventos apropiados para registrarse y recibir notificaciones de los editores.
Ok, no sé cómo ser tan poderoso. Aquí está mi comprensión:
1. En el modo Observador, el objeto de destino es responsable de mantener el observador. En el modo de publicación/suscripción, a los editores no les importan los suscriptores, solo son responsables de tirar mensajes y dejarlos en paz.
2. En el modo Observador, el observador necesita proporcionar una interfaz y luego llamar a esta interfaz cuando el objeto de destino cambia para mantener su propio estado y el estado objetivo consistente. Es decir, todos los observadores deben tener una interfaz unificada (por ejemplo, el método de actualización escrito anteriormente, el método de todos debe llamarse este nombre). En el modo de publicación/suscripción, la activación del evento de suscriptor no depende de dicha interfaz, sino que el suscriptor se desencadena escuchando un mensaje específico (este mensaje generalmente contiene el nombre y los parámetros requeridos por el suscriptor). Se puede entender que el suscriptor no está escuchando al editor, sino el grupo de mensajes. Mientras haya un mensaje que le importe en el grupo de mensajes, desencadena el evento, sin importar quién publicara el mensaje en el pasado. Los editores y suscriptores están desacoplados.
La siguiente es la implementación del modo de publicación/suscripción en JS. Copie y péguelo en la consola y lo entenderá después de intentarlo:
La copia del código es la siguiente:
var pubSub = (function () {
var q = {}
temas = {},
subuid = -1;
// publicar un mensaje
q.publish = function (topic, args) {
if (! temas [tema]) {return;}
var subs = temas [tema],
len = subs.length;
mientras (len--) {
subs [len] .func (tema, args);
}
devolver esto;
};
// suscribirse a eventos
Q.SubScribe = function (topic, func) {
¿Temas [tema] = temas [tema]? Temas [tema]: [];
var token = (++ Subuid) .ToString ();
Temas [tema] .push ({
Token: Token,
FUNC: FUNC
});
token de regreso;
};
regresar Q;
// cancelar la suscripción y dejar de escribir, recorrer temas y luego devolver el token guardando el anterior, elimine el elemento especificado
}) ();
// evento desencadenado
var logmsg = function (temas, datos) {
console.log ("Logging:" + temas + ":" + datos);
}
// Escuche el mensaje especificado 'msgname'
var sub = pubsub.subscribe ('msgname', logmsg);
// publica un mensaje 'msgname'
pubSub.publish ('msgname', 'hello world');
// publica un mensaje no listado 'msgname1'
PubSub.Publish ('OTROMSGNAME', '¡Yo también!');