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

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

Broker.js(中间层)

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 (发布者)

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

Subscriber.js

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}`);
	}
}

使用`

html 复制代码
<!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>
相关推荐
Hilaku2 分钟前
工作 5 年后,决定你薪资上限的究竟是什么?
前端·javascript·程序员
Revolution6110 分钟前
页面更新后为什么出现 Loading chunk failed:旧页面如何请求了已删除的构建产物
前端·面试·前端工程化
weixin_BYSJ198715 分钟前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
JavaGuide17 分钟前
GitHub 9.8 万 Star!把整个代码仓库变成知识图谱,这个 AI Coding 工具太适合 Claude Code / Codex 了
前端·后端·ai编程
hunterandroid31 分钟前
[鸿蒙从零到一] HarmonyOS 通知与提醒实战:消息发布、点击跳转与定时触达
前端
Lxinz38 分钟前
vscode调试ts代码思路
前端
极梦网络无忧1 小时前
real-ai-editor:一款轻量、智能的纯前端 AI 富文本与 Markdown 编辑器
前端·人工智能·编辑器
ClickHouseDB1 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
gis开发之家1 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码
technology_x2 小时前
2026年财务报表分析软件测评:兼容与安全解析
java·服务器·前端