当前位置: 首页 > article >正文

JS 设计模式之发布订阅模式

发布订阅模式和观察者模式很像,他们的主要区别就是发布订阅模式在中间加了一层,完成对订阅者的通知

Broker.js(中间层)

class Broker {
	constructor() {
		// 存储订阅的频道和订阅者
		this.infoMap = new Map();
	}
	// topic为订阅的主题
	getSubscriber(topic) {
		return this.infoMap.get(topic) || [];
	}
	subscribe(topic, sub) {
		const subscribers = this.getSubscriber(topic);
		subscribers.push(sub);
		this.infoMap.set(topic, subscribers);
	}
	unsubscribe(topic, sub) {
		const subscribers = this.getSubscriber(topic);
		const index = subscribers.indexOf(sub);
		if (index > -1) {
			subscribers.splice(index, 1);
		}
		this.infoMap.set(topic, subscriber);
	}
	notifySubscribers(topic, msg) {
		const subscribers = this.getSubscriber(topic);
		subscribers.forEach((sub) => {
			sub.getMsg(topic, msg);
		});
	}
}

Publisher.js (发布者)

class Publisher {
	constructor(broker) {
		this.broker = broker;
	}
	publish(topic, msg) {
		console.log(`${topic}已经发布了新内容----${msg}`);
		this.broker.notifySubscribers(topic, msg);
	}
}

Subscriber.js

class Subscriber {
	constructor(broker) {
		this.broker = broker;
	}
	subscribe(topic) {
		console.log("订阅成功");
		// 通过中间层对发布者进行订阅
		this.broker.subscribe(topic, this);
	}
	unsubscribe(topic) {
		console.log("取消订阅成功");
		// 通过中间层取消对发布者的订阅
		this.broker.unsubscribe(topic, this);
	}
	getMsg(topic, msg) {
		console.log(`${topic}主题更新了--${msg}`);
	}
}

使用`

<!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 src="./Broker.js"></script>
		<script src="./Publisher.js"></script>
		<script src="./Subscriber.js"></script>
		<script>
			const broker = new Broker();
			const sub1 = new Subscriber(broker);
			const sub2 = new Subscriber(broker);
			const pub = new Publisher(broker);
			sub1.subscribe("恐怖片");
			sub2.subscribe("恐怖片");
			pub.publish("恐怖片", "恐怖片更新了");
		</script>
	</body>
</html>


http://www.kler.cn/a/291576.html

相关文章:

  • 法学硕士,有哪些专业可以申请呢?
  • 图片懒加载
  • android EditText密码自动填充适配
  • Android 蓝牙Bluedroid线程池设计思路介绍
  • Datawhale AI冬令营——Chat-悟空设计
  • <项目代码>YOLO Visdrone航拍目标识别<目标检测>
  • 算法训练营|图论第5天
  • 搭建基于QT的TCP服务器与客户端
  • 国际标准图像分辨率测试ISO12233 - 2017中文翻译
  • MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题
  • 「Python程序设计」模块式编程:函数
  • 基于 SpringBoot 冬奥会科普平台
  • 【Java】实体类Javabean的运用案例
  • 社区电商系统源码之卷轴模式:商业模式分析
  • BUUCTF—[网鼎杯 2020 朱雀组]phpweb
  • Laravel 中间件与事件应用教程
  • CSS解析:盒模型
  • Selenium 调用 JavaScript 操作带有 readonly 属性 的日期控件
  • erlang学习:用ETS和DETS存储数据
  • Ascend C算子性能优化实用技巧02——内存优化
  • 获取Word、PPT、Excel、PDF文件页数及加密校验
  • 145. 利用 Redis Bitmap实践: 用户签到统计
  • Android TextView设置跑马灯失效
  • ACL实验配置学习笔记
  • 【网络安全 | 渗透工具】Cencys+Shodan使用教程
  • 科研绘图系列:R语言差异基因四分图(Quad plot)