JavaScript设计模式-发布-订阅者模式
生活中的小例子
报社订阅
我们知道,订阅报纸时,需要知道报社,用户向报社通过拨打电话或者发送短信的方式告知报社订阅报纸,报社接收到订阅信息便会录入数据库记录下用户的订阅信息,当报纸到达时,又会有专业配发人员通过查询订阅信息挨家挨户送报。
这其实就是一个简单的发布-订阅者模式,用户就是订阅者,而报社就是发布者,一个报社可以对应多个用户,可以把送报当作发布信息的过程。
房屋出租/购买中介
与报社订阅的例子相类似,用户即需要租房,购房的人, 用户需要获取房屋信息,而卖房,出租房的人需要获取用户资源,他们之间如果需要取得联系,需要购房者和卖房者进行一对一的信息交换,如果卖房者太多,购房者则需要与成千上万个卖房者取得联系,同理,如果购房者太多,卖房者也需要与成千上万个购房者去的联系。这样的沟通效率就十分的低下。
因此购房者与卖房者之间的这个中介,就可以当作一个发布者,而购房者和卖房者均是订阅者。购房者和卖房者都只需要和中介进行沟通,就形成了这样一对一的关系,而不是一对多,多对多的关系了。卖房者只需要将自己的房源信息告诉给中介,并且订阅用户信息,当有购买者选择该房源,中介者则会自动将房源信息发送给对应卖房者;当有购房者想要购买房源,则只需要向中介订阅房源信息,则可以在存在房源时,直接获取到房源信息。
- 需要知道中介平台
- 该平台需要有记录用户订阅信息的数据库
- 该平台需要提供订阅信息的接口
- 该平台内置发布信息的方法
let office = {} //1
office.clientList = {} //2
office.listen = function(key,fn){ //3
if(!this.clientList[key]) {
this.clientList[key] = []
}
this.clientList[key].push(fn)
}
office.tigger = function(key) { //4
let fns = this.clientList[key]
if(!fns || fns.length === 0) {
return false
}
for(let i = 0; i < fns.length; i++) {
fns[i].apply(this, arguments)
}
}
现在似乎存在一个问题,用户与中介之间依然存在耦合性,那么这个问题该如何解决呢,请看下文(JavaScript设计模式-中介者模式)