发布-订阅模式

开发的点点滴滴 开发的点点滴滴     2022-09-20     350

关键词:

发布—订阅模式,它定义了一种一对多的依赖关系,当发布者发出一种消息时,所有订阅该消息的任务(回调函数)都将开始执行。
订阅是希望在某消息或事件发生时可以执行对应的任务;发布指对外广播告知消息已经到达,所有订阅了该消息的任务可以执行了。
在传统的发布-订阅模式中,如Java,通常需要把订阅者对象自身当成引用传入发布者对象中,而在 JavaScript 中,使用回调函数的形式来代替订阅者。
nodejs中的on/emit也是采用这种模式在模块间通信的。
优点:在异步编程中代替传递回调函数;模块间的通信变成松耦合。
  // 发布者对象
  var Pubsub = function () {
    // Storage for topics that can be broadcast or listened to
    this.topics = {};
    // A topic identifier
    this.subUid = -1;
  }
  Pubsub.prototype = {
    // Subscribe to events of interest with a specific topic name and a callback function, to be executed
    // when the topic/event is observed
    subscribe: function (topic, func) {
      if (!this.topics[topic]) {
        this.topics[topic] = [];
      }
      var token = ( ++this.subUid ).toString();
      this.topics[topic].push({
        token: token,
        func: func
      });
      return token;
    },
    // Publish or broadcast events of interest with a specific topic name and arguments
    publish: function (topic, args) {
      if (!this.topics[topic]) {
        return false;
      }
      var subscribers = this.topics[topic];
      subscribers.forEach(function (el) {
        el.func(topic, args)
      });
      return this;
    },
    // Unsubscribe from a specific topic, based on a tokenized reference to the subscription
    unsubscribe: function (token) {
      for (var m in this.topics) {
        if (this.topics[m]) {
          this.topics[m] = this.topics[m].filter(function (el) {
            return el.token !== token;
          });
          return token;
        }
      }
      return this;
    }
  }

使用:

//  消息/时间发发生时,执行所有订阅该消息的任务
 var store = new Pubsub();
  store.subscribe(‘available‘, function (data) {
    console.log(‘有货了‘);
  });
  store.subscribe(‘available‘, function (data) {
    console.log(‘有货了‘);
  });
  setTimeout(() => store.publish(‘available‘,20), 2000)

解耦模块,方便扩展:

技术分享
  $.ajax(‘http:www.example.com/login‘, function (data) {
    header.setAvatar(data.avatar);
    message.refresh();  // 刷新消息
    cart.refresh();     // 刷新购物车
    address.refresh();   // 新增刷新地址时耦合性太强,不好维护
  });

  // 更改为发布-订阅模式:
  //登录模块只需要发布登录成功的消息,不用了解业务方的内部实现及目的。而业务方接受到消息之后,就会开始进行各自的业务处理。
  var login = new Pubsub();
  var header = (function () {   // header 模块
    login.subscribe(‘loginSuccess‘, function (data) {
      header.setAvatar(data.avatar);
    });
    return {
      setAvatar: function (data) {
        console.log(‘设置头像‘);
      }
    }
  })();
  $.ajax(‘http:www.example.com/login‘, function (data) {
    login.publish(‘loginSuccess‘, data);   // 发布登录成功的消息
  });
View Code

 





设计模式-发布-订阅者模式(代码片段)

1、发布-订阅者设计模式定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知观察者模式和发布订阅模式区别观察者模式是由具体目标(发布者/被观察者)调度的,而发... 查看详情

发布-订阅模式

1.什么是发布订阅模式发布订阅模式又叫观察者模式,他是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变,所有依赖他的对象都将得到通知。在javascript开发中,我们一般用事件模型来替代传统的发布-订阅模... 查看详情

发布-订阅模式

发布-订阅模式       发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。JavaScript开发中我们一般用事件模型来代替传... 查看详情

redisredis发布订阅通信模式(发布订阅模式|订阅频道|发布消息|接收消息)(代码片段)

文章目录一、发布订阅模式二、订阅频道三、发布消息四、接收消息一、发布订阅模式Redis中存在一种发布订阅消息通信模式:消息发布者:负责发送消息,订阅者需要订阅该发布者频道;消息订阅者:负责接收消息;订阅者先订阅发布... 查看详情

发布-订阅模式

发布—订阅模式,它定义了一种一对多的依赖关系,当发布者发出一种消息时,所有订阅该消息的任务(回调函数)都将开始执行。订阅是希望在某消息或事件发生时可以执行对应的任务;发布指对外广播告知消息已经到达,所... 查看详情

设计模式:发布订阅模式(代码片段)

发布订阅模式调度中心相关方法订阅取消订阅触发示例调度中心classCenterconstructor()this.message=//订阅on(type,fn)if(this.message[type]===undefined)this.message[type]=[]this.message[type].push(fn)//取消订阅off 查看详情

设计模式:发布订阅模式(代码片段)

发布订阅模式调度中心相关方法订阅取消订阅触发示例调度中心classCenterconstructor()this.message=//订阅on(type,fn)if(this.message[type]===undefined)this.message[type]=[]this.message[type].push(fn)//取消订阅off(type,fn) 查看详情

发布订阅模式和委托

观察者模式/发布订阅模式:发布者有一个接口,订阅者也有一个接口。发布者中有一个列表 List<Observer>mList=newArrayList<>();,该列表中存储着所有订阅此发布的订阅者的信息,订阅者接口中有一个方法update,任何订阅... 查看详情

spring源码之七registerlisteners()及发布订阅模式

Spring源码之七registerListeners()及发布订阅模式大家好,我是程序员田同学。今天带大家解读refresh()方法中的registerListeners()方法,也就是我们经常说的Spring的发布-订阅模式。文章首先举一个发布-订阅模式的样例,然后讲解了发布-... 查看详情

eventbus发布-订阅模式(eventbus组成模块|观察者模式)(代码片段)

文章目录一、发布-订阅模式二、EventBus组成模块三、观察者模式一、发布-订阅模式发布订阅模式:发布者Publisher:状态改变时,向消息中心发送事件;订阅者Subscriber:到消息中心订阅自己关心的事件;消息中心:负责维护一个消息队列,... 查看详情

发布-订阅者模式(观察者模式)(代码片段)

发布订阅者模式还有一些好的列子应用可以看看javascript设计模式与开发实践这本书!!!!!一、发布订阅模式是什么发布订阅者模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,... 查看详情

发布/订阅模式

发布/订阅模式  Pub/Sub模式包含三个角色主题(Topic),发布者(Publisher),订阅者(Subscriber)。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点每个消息可以有多个消费者发布者和订阅者之... 查看详情

发布订阅模式的理解

发布---订阅模式它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。发布订阅模式的优点:支持简单的广播通信,当对象状态发生改变... 查看详情

发布订阅模式(代码片段)

letfs=require(‘fs‘);//发布订阅发布和订阅没关系中间通过数组进行关联functionEvents()this.callbacks=[];this.results=[];//订阅Events.prototype.on=function(callback)this.callbacks.push(callback);//发布Events.prototype.emit=func 查看详情

观察者模式vs发布-订阅模式

...道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者(Publisher)和订阅者(Subscriber)不知道对方的存在。它们只有通过消息代理(信息中介)进行通信。2.在发布订阅模式中,组件是松散耦合的,正... 查看详情

观察者和发布订阅模式的区别

     观察者模式和发布订阅模式有什么区别?大多数的回答都是:Publishers+Subscribers=ObserverPattern,24种基本的设计模式并没有发布-订阅模式,发布订阅模式属于并发型模式;像典型的Mq;这两种相似单并不可以... 查看详情

activemq入门系列三:发布/订阅模式(代码片段)

...)》中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub&Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式。一、理论基础发布/订阅模式的工作示意图:消息生产者将消息... 查看详情

javascript发布订阅pubsub模式

...消息的时候,把订阅的消息push到指定消息的队列中,当发布者发布消息的时候,我们遍历执行push到指定消息队列中的回调事件。varPubsub=(function(){vareventObj={};return{subscribe:function(event,fn){eventObj[event]=fn},publish:function(event 查看详情