js实现发布订阅模式

定义

发布订阅是一种消息范式,消息的发送者(发布者)不会将消息直接发送给特定的接收者(订阅者),而是将发布的消息发给消息代理,由消息代理对消息进行过滤,消息代理通常执行存储转发的功能将消息从发布者发送到订阅者

特点

松耦合:订阅者可以订阅多个类型的消息,发布者不需要关心有多少订阅者

示例

实现一个类似微信公众号的发布文章(发布)、取消关注(取消订阅)、关注公众号(订阅)的功能。
要实现的功能。

  • 用户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>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_35958891/article/details/108436485
今日推荐