学习设计模式——发布-订阅模式

发布订阅模式,又叫观察者模式,它定义了一种一对多的关系,让多个订阅者对象监听某一个发布者,发布者状态发生更新时派发信息给每一个订阅者。
举个例子,我想买一双AJ鞋,鞋店没货了,我给店员留个号码,我不关心店家什么时候到货。店家到货后店员会给我打电话通知我,我想要的鞋到货了,我可以去购买。

代码实现

// ES5 IIFE 实现
    var Publisher = (function() {
      var _subsMap = {} // 存储订阅者
      return {
        // 消息订阅
        subscribe(type, cb) {
          if(_subsMap[type]) {
            if(_subsMap[type].indexOf(cb) === -1) {
              _subsMap[type].push(cb)
            }
          } else {
            _subsMap[type] = [cb]
          }
        },
        // 消息退订
        unSubscribe(type, cb) {
          if(!_subsMap[type] || _subsMap[type].indexOf(cb) === -1) return
          var idx = _subsMap[type].indexOf(cb)
          _subsMap[type].splice(idx, 1)
        },
        // 消息发布
        notify(type) {
          if(!_subsMap[type]) return
          var params = Array.prototype.slice.call(arguments)
          _subsMap[type].forEach(function(cb) {
            cb(params)
          })
        }
      }
    })()

    function piXie(message) {
      console.log('pipipi'+message)
    }
    Publisher.subscribe('运动鞋', message => console.log('AJ830'+message)) // 订阅运动鞋
    Publisher.subscribe('运动鞋', message => console.log('JK960'+message)) // 订阅运动鞋
    Publisher.subscribe('皮鞋', piXie) // 订阅皮鞋

    Publisher.notify('运动鞋', '运动鞋到货~速来')
    Publisher.notify('皮鞋', '皮鞋到货~速来')
    Publisher.unSubscribe('皮鞋', piXie)
    Publisher.notify('皮鞋', '皮鞋到货~速来2')

    // ES6
    class Publisher2 {
      constructor() {
        this._subsMap = {}
      }

      subscribe(type, cb){
        if(this._subsMap[type]) {
          if(!this._subsMap[type].includes(cb)) {
            this._subsMap[type].push(cb)
          }
        } else {
          this._subsMap[type] = [cb]
        }
      }

      unSubscribe(type, cb) {
        if(!this._subsMap[type] || !this._subsMap[type].includes(cb)) return
        const idx = this._subsMap[type].indexOf(cb)
        this._subsMap[type].splice(idx, 1)
      }

      notify(type, ...payload) {
        if(!this._subsMap[type]) return
        this._subsMap[type].forEach(cb => cb(...payload))
      }
    }

    const adadis = new Publisher2()
    function fanBuXie(message) {
      console.log('139zzz'+ message)
    }
    adadis.subscribe('运动鞋', message => console.log('152xxx'+ message))// 订阅运动鞋
    adadis.subscribe('运动鞋', message => console.log('138yyy'+ message))
    adadis.subscribe('帆布鞋', fanBuXie)// 订阅帆布鞋
    adadis.notify('运动鞋',' 运动鞋到货了 ~') // 打电话通知买家运动鞋消息
    adadis.unSubscribe('帆布鞋', fanBuXie) //取消订阅帆布鞋信息
    adadis.notify('帆布鞋',' 帆布鞋售罄了 T.T') // 打电话通知买家帆布鞋消息
    ;

发布-订阅模式的通用实现

  1. Publisher:发布者,当消息发生时负责通知对应订阅者
  2. Subscriber:订阅者,当消息发生时被通知的对象
  3. SubscriberMap:持有不同 type 的数组,存储有所有订阅者的数组
  4. type:消息类型,订阅者可以订阅的不同消息类型
  5. subscribe:该方法为将订阅者添加到 SubscriberMap 中对应的数组中
  6. unSubscribe:该方法为在 SubscriberMap 中删除订阅者
  7. notify:该方法遍历通知 SubscriberMap 中对应 type 的每个订阅者
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值