定义
发布订阅是一种消息范式,消息的发送者(发布者)不会将消息直接发送给特定的接收者(订阅者),而是将发布的消息发给消息代理,由消息代理对消息进行过滤,消息代理通常执行存储转发的功能将消息从发布者发送到订阅者
特点
松耦合:订阅者可以订阅多个类型的消息,发布者不需要关心有多少订阅者
示例
实现一个类似微信公众号的发布文章(发布)、取消关注(取消订阅)、关注公众号(订阅)的功能。
要实现的功能。
- 用户a关注了公众号“人民日报”
- 用户b关注了公众号“湖北日报”
- 用户c关注了公众号“人民日报”
- “人民日报公众号”发布“最高礼遇!以国之名,致敬!”
- "湖北日报"公众号发布“教育部明确!2021年起免试认定!”
- 用户a取消订阅“人民日报“公众号
- 人民日报发布文章“严防不懈!新增确诊2例,均为境外输入”
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
class Sub{
constructor(){
// 收集订阅信息,调度中心
this.list = {
}
}
// 订阅
on(name,userId,fn){
if(!(this.list[name] instanceof Array)){
this.list[name] = []
}
this.list[name].push({
userId,fn})
}
// 发布
emit(name,content){
this.list[name].forEach(item=>{
item.fn(content)
})
}
// 取消订阅
off(name,userId){
this.list[name].forEach((item,index)=>{
if(item.userId === userId){
this.list[name].splice(index,1)
}
})
}
}
let sub = new Sub();
//A关注人民日报公众号
sub.on('人民日报','A',function(content){
console.log('A接收到人民日报推送的消息',content)
})
//B关注湖北日报公众号
sub.on('湖北日报','B',function(content){
console.log('B接收到湖北日报推送的消息',content)
})
//C关注人民日报公众号
sub.on('人民日报','C',function(content){
console.log('C接收到人民日报推送的消息',content)
})
//
sub.emit('人民日报','最高礼遇!以国之名,致敬!')
sub.emit('湖北日报','教育部明确!2021年起免试认定!')
sub.off('人民日报','A')
sub.emit('人民日报',"严防不懈!新增确诊2例,均为境外输入")
</script>
</body>
</html>