Maison  >  Article  >  interface Web  >  Un exemple simple de modèle de publication/abonnement dans les astuces JavaScript_javascript

Un exemple simple de modèle de publication/abonnement dans les astuces JavaScript_javascript

WBOY
WBOYoriginal
2016-05-16 16:32:081198parcourir

La dernière fois que j'ai étudié le mode observateur, de nombreux articles disaient qu'il était également appelé Subscribe/Publish (mode publication/abonnement). Mais dans le livre "Javascript Design Patterns", il existe encore quelques différences entre ces deux modèles. Les mots originaux du livre sont les suivants :

1. Le mode Observateur exige que les observateurs qui souhaitent recevoir des notifications de sujet s'abonnent aux événements de changement de contenu.

2.Le mode S'abonner/Publier utilise un canal sujet/événement, qui se situe entre les abonnés et les éditeurs. Le système d'événements permet au code de définir des événements spécifiques à l'application auxquels peuvent être transmis des paramètres personnalisés contenant les valeurs requises par les abonnés. Son objectif est d'éviter les dépendances entre abonnés et éditeurs.

Différent du modèle Observer en ce sens qu'il permet à tout abonné d'exécuter des gestionnaires d'événements appropriés pour s'inscrire et recevoir des notifications de l'éditeur.

D'accord, je ne sais pas. Voici ce que je comprends :

1. Dans le modèle d'observateur, l'objet cible est responsable du maintien de l'observateur. Dans le modèle de publication/abonnement, l'éditeur ne se soucie pas des abonnés et est uniquement responsable de la diffusion des messages.

2. Dans le modèle d'observateur, l'observateur doit fournir une interface, puis appeler cette interface lorsque l'objet cible change pour garder son propre état cohérent avec l'état cible. Autrement dit, tous les observateurs doivent avoir une interface unifiée (comme la méthode de mise à jour écrite ci-dessus, la méthode de chacun doit porter ce nom). Dans le modèle publication/abonnement, le déclenchement des événements d'abonné ne repose 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 comprend que ce que l'abonné surveille n'est pas l'éditeur, mais le pool de messages. Tant qu'il y a un message qui l'intéresse dans le pool de messages, un événement est déclenché, quel que soit celui qui a publié le message. Les éditeurs et les abonnés sont découplés.

Ce qui suit est l'implémentation du mode publication/abonnement dans js. Copiez-le et collez-le dans la console et essayez-le :

Copier le code Le code est le suivant :

var pubsub = (fonction(){
varq = {}
sujets = {},
         subUid = -1;
//Publier l'actualité
​ q.publish = function(sujet, arguments) {
Si(!topics[topic]) {return;}
      var subs = sujets[sujet],
            len = subs.length;
​​​​pendant que(len--) {
              subs[len].func(topic, args);
>
         renvoie ceci ;
};
//Abonnez-vous aux événements
​ q.subscribe = function(sujet, func) {
sujets[sujet] = sujets[sujet] ? sujets[sujet] : [];
      var token = ( subUid).toString();
sujets[sujet].push({
jeton : jeton,
              fonction : fonction
});
         retourner le jeton ;
};
Retour q;
//Plus d'écriture si vous annulez l'abonnement, parcourez les sujets, puis renvoyez le token en l'enregistrant, et supprimez l'élément spécifié
})();
//Événement déclenché
var logmsg = fonction (sujets, données) {
console.log("logging:" sujets ": données);
>
//Écoutez le message spécifié 'msgName'
var sub = pubsub.subscribe('msgName', logmsg);
//Publier le message 'msgName'
pubsub.publish('msgName', 'hello world');
//Publier un message non surveillé 'msgName1'
pubsub.publish('anotherMsgName', 'moi aussi !');
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn