发布订阅模式
含义说明
发布-订阅模式⼜叫观察者模式,它定义对象间的⼀种⼀对多的依赖关系,当⼀个对象的状态发⽣改变时,所有依赖于它的对象都将得到通知。先订阅再发布
作⽤
1】⽀持简单的⼴播通信,当对象状态发⽣改变时,会⾃动通知已经订阅过的对象
2】可以应⽤在异步编程中,替代回调函数,可以订阅ajax之后的事件,只需要订阅⾃⼰需要的部分(那么ajax调⽤发布之后订阅的就可以拿到消息了)(不需要关⼼对象在异步运⾏时候的状态)
3】对象之间的松耦合,两个对象之间都互相不了解彼此。但是,不影响通信,当有新的订阅者出现的时候,发布的代码⽆需改变,同样发布的代码改变,只要之前约定的事件的名称没有改变,也不影响订阅
4】vue react 之间实现跨组件之间的传值
⽣活中的实例
⽐如⼩红最近在淘宝⽹看上⼀双鞋⼦,但是呢,联系到卖家后,才发现这双鞋卖光了,但是⼩红对这双鞋⼜⾮常喜欢,所以联系卖家,问卖家什么时候有货,卖家告诉她,要等⼀个星期后才有货,卖家告诉⼩红,要是你喜欢的话,可以收藏我们店铺,等有货的时候再通知你,所以⼩红收藏了此店铺,但与此同时,⼩明,⼩花等也喜欢这双鞋,也收藏了该店铺;等来货的时候就会依次通知他们。
如何实现发布——订阅模式
1、⾸先要想好谁是发布者(⽐如上⾯的卖家)
2、然后给发布者添加⼀个缓存列表,⽤于存放回调函数来通知订阅者(⽐如上⾯的买家收藏了卖家的店铺,卖家通过收藏了该店铺的⼀个列表名单)
3、最后就是发布消息,发布者遍历这个缓存列表,依次触发⾥⾯存放的订阅者回调函数
var shopObj ={}// 定义发布者
shopObj.list =[]// 缓存列表存放的是订阅的函数
// 增加订阅者
shopObj.listen=function(key,fn){
if(!this.list[key]){
this.list[key]=[]
}
this.list[key].push(fn)
}
// 发布消息
// 对应的key取出来
var key = Array.prototype.shift.call(arguments) var fns =this.list[key]
if(!fns || fns.length ==0){
return
}家常炒螃蟹
for(var i =0, fn; fn = fns[i++];){
fn.apply(this, arguments)
}
}
shopObj.listen('red',function(size){
console.log(`尺码是${size}`)
})
shopObj.listen('black',function(size){
console.log(`尺码是${size}`)
})
/
/ ⼩红丹参保心茶
// ⼩明
封装
var event ={
list:[],
listen:function(key,fn){
if(!this.list[key]){
this.list[key]=[]
}
企业商业模式this.list[key].push(fn)
小班建构游戏
},
trigger:function(){
// 对应的key取出来
var key = Array.prototype.shift.call(arguments)
var fns =this.list[key]
if(!fns || fns.length ==0){
return
}
for(var i =0, fn; fn = fns[i++];){
fn(...arguments)
}
}
}
var fns =this.list[key]
if(!fns){
return fal
}
if(!fn){
fn &&(fns.length =0)
}el{
for(var i = fns.length -1; i >=0; i--){
var _fn = fns[i]包玉刚图书馆
if(_fn == fn){
fns.splice(i,1)
折皮卡丘
}
}
}
}
再封装
var Event =(function(){
var list ={},
listen,
trigger,
remove;
listen=function(key, fn){
if(!this.list[key]){
this.list[key]=[]
}
this.list[key].push(fn)
}
trigger=function(){
// 对应的key取出来
var key = Array.prototype.shift.call(arguments)
var fns =this.list[key]
if(!fns || fns.length ==0){
return
}
for(var i =0, fn; fn = fns[i++];){
fn(...arguments)
}
}
remove=function(key, fn){
var fns =this.list[key]
if(!fns){
return fal
}
if(!fn){
柳公权楷书字帖fn &&(fns.length =0)
}el{
for(var i = fns.length -1; i >=0; i--){
var _fn = fns[i]
if(_fn == fn){
fns.splice(i,1)
}
}
}
}
return{
listen,
trigger,
remove
}
})()
发布订阅模式 实现低耦合
⽤发布-订阅模式重写之后,对⽤户信息感兴趣的业务模块将⾃⾏订阅登录成功的消息事件。当登录成
散步英语怎么读功时,登录模块只需要发布登录成功的消息,⽽业务⽅接收到消息之后,就会开始进⾏各⾃的业务处理,登录模块并不关⼼业务⽅究竟要做什么,也不想去了解它们的内部细节。