La dernière fois que j'ai étudié le mode observateur, de nombreux articles ont déclaré qu'il était également appelé abonnement / publication (mode publication / abonnement). Mais dans le livre "JavaScript Design Pattern", il existe encore quelques différences entre les deux modèles. Les mots originaux du livre sont les suivants:
1. Le mode observateur nécessite que les observateurs qui souhaitent recevoir des notifications de sujet doivent s'abonner aux événements où le contenu change.
2. Le mode Subscribe / Publish utilise un canal de thème / événement, qui est entre abonné et éditeur. Le système d'événements permet au code de définir des événements spécifiques pour l'application, qui peuvent transmettre des paramètres personnalisés qui contiennent les valeurs requises par l'abonné. Le but est d'éviter les dépendances entre les abonnés et les éditeurs.
La différence par rapport au mode observateur est qu'elle permet à tout abonné d'exécuter les gestionnaires d'événements appropriés pour s'inscrire et recevoir des notifications des éditeurs.
Ok, je ne sais pas comment être si puissant. Voici ma compréhension:
1. En mode observateur, l'objet cible est responsable du maintien de l'observateur. En mode publication / abonnement, les éditeurs ne se soucient pas des abonnés, ils ne sont responsables que de jeter des messages et de les laisser seuls.
2. En mode observateur, l'observateur doit fournir une interface, puis appeler cette interface lorsque l'objet cible change pour garder son propre état et l'état cible cohérent. Autrement dit, tous les observateurs doivent avoir une interface unifiée (par exemple, la méthode de mise à jour écrite ci-dessus, la méthode de chacun doit être appelée ce nom). En mode publication / abonnement, le déclenchement de l'événement d'abonné ne s'appuie pas sur une telle interface, mais est déclenché par l'abonné en écoutant un message spécifique (ce message contient généralement le nom et les paramètres requis par l'abonné). On peut comprendre que l'abonné n'écoute pas l'éditeur, mais le pool de messages. Tant qu'il y a un message dont il se soucie dans le pool de messages, il déclenche l'événement, peu importe qui a publié le message dans le passé. Les éditeurs et les abonnés sont découplés.
Ce qui suit est la mise en œuvre du mode Publish / Sbonned dans JS. Copiez et collez-le dans la console et vous le comprendrez après avoir essayé:
La copie de code est la suivante:
var pubsub = (function () {
var q = {}
sujets = {},
subuid = -1;
// Publier un message
q.publish = fonction (sujet, args) {
if (! sujets [thème]) {return;}
var subs = sujets [sujet],
len = sous-ligne;
while (len--) {
subs [len] .func (sujet, args);
}
retourner ceci;
};
// Abonnez-vous aux événements
Q.Subscribe = fonction (sujet, func) {
sujets [Sujet] = sujets [Sujet]? sujets [sujet]: [];
var token = (++ subuid) .toString ();
sujets [thème] .push ({
Token: jeton,
Func: Func
});
Token de retour;
};
retour q;
// désubserve et arrêter l'écriture, les sujets de traversée, puis le token de retour en enregistrant le précédent, supprimez l'élément spécifié
}) ();
// Événement déclenché
var logmsg = fonction (sujets, données) {
Console.log ("Logging:" + sujets + ":" + data);
}
// écoute le message spécifié «MSGNAME»
var sub = pubsub.subscribe ('msgname', logmsg);
// a publié un message «MSGNAME»
pubsub.publish («msgname», «bonjour mon monde»);
// a publié un message non répertorié 'MSGNAME1'
pubsub.publish («AnothermsgName», «Moi aussi!»);