发布-订阅模式又叫观察者模式。它定义对象间的一种一对多的关系。当一个对象的状态发生改变时,所有依赖它的对象
都将得到通知。在JavaScript开发中,我们一般用事件模型来替代传统的发布-订阅模式。
如何一步步实现发布-订阅模式
- 首先要指定好谁充当发布者。(比如售楼处)
- 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者(售楼处的花名册)
- 最后发布消息的时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数(遍历花名册,挨个发消息)
简单实现如下
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)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END