阅读 209

设计模式-发布订阅模式

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

如何一步步实现发布-订阅模式

  1. 首先要指定好谁充当发布者。(比如售楼处)
  2. 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者(售楼处的花名册)
  3. 最后发布消息的时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数(遍历花名册,挨个发消息)

简单实现如下

var salesOffice = {} // 定义售楼处
salesOffice.clientList = [] // 花名册,缓存列表,存放订阅者的回调函数
salesOffice.listen = function (fn) { // 添加订阅者
    this.clientList.push(fn) // 订阅的消息添加进缓存列表
}
salesOffice.trigger = function () { // 发布消息
    for (var i = 0, fn; fn = this.clientList[i++];) {
        fn.apply(this, arguments)
    }
}
复制代码

简单的测试

// test
salesOffice.listen(function (prace,squareMeter) {
    console.log('价格:', prace);
    console.log('面积:', squareMeter);
})
salesOffice.trigger(2000000,110) //价格: 2000000 面积: 110

复制代码

已经实现在最简易版的发布订阅,但其实是存在问题的,每个人可能订阅户型是不同的, 上面我们实现的是,只要一开始销售就通知所有订阅的人,显然是不合理的,将代码再来改写一下

var salesOffice = {}
salesOffice.clientList = {}
salesOffice.listen=function(key,fn){
  if(!this.clientList[key]){
    this.clientList[key]=[]
  }
  this.clientList[key].push(fn)
}
salesOffice.trigger=function(){
  arguments = Array.from(arguments)
  var key = arguments.shift()
  // var  key = Array.prototype.shift.call(arguments)
  fns=this.clientList[key]
  if(!fns||fns.length===0){
     return false
  }
  for(let i=0,fn;fn=fns[i++]){
    fn.apply(this,arguments)
  }
 
}
 
salesOffice.listen('squarterMetter80',function(price){
    console.log('squarterMetter80 价格:'+price)
})
salesOffice.listen('squarterMetter90',function(price){
    console.log('squarterMetter90价格:'+price)
})
 
salesOffice.trigger('squarterMeter80',8000)
 
salesOffice.trigger('squarterMeter90',9000)
复制代码
文章分类
前端