栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

发布订阅者模式(详细比喻)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

发布订阅者模式(详细比喻)

✨SyncHook
  • 简要
    • 一:了解发布订阅者模式
    • 二:实现发布订阅者模式勵
      • 2.1:定义一个发布者
      • 2.2:给发布者添加功能
      • 2.3:使用发布订阅者模式
      • 2.4:发布订阅者优化

简要

在学习这篇文章中,你可以学到发布订阅者模式是什么?怎么实现发布订阅者模式?

预备基础:
javascript淋


一:了解发布订阅者模式

什么是发布订阅者模式臨?
例:你去买货断货了,你要跟老板预定货物,你要写下名字还有你的货物名称,当到货了老板会给你打电话,这就是发布订阅者模式。

老板:发布订阅者。

你:订阅者。

订阅者将信息填写到发布者的缓存列表中(电话薄)。
当发布者到货之后就会遍历缓存列表依次通知订阅者。


二:实现发布订阅者模式勵 2.1:定义一个发布者

创建一个 SyncHook 类,其中有 2 个方法:
tap:缓存列表(电话薄)
call:遍历缓存列表(电话薄)

class SyncHook {
	constructor() {
		
	}
}

let hook = new SyncHook();

2.2:给发布者添加功能

创建一个 SyncHook 类,其中有 2 个方法 1 个属性:
tap:缓存列表(电话薄)
call:遍历缓存列表(电话薄)

tasks:缓存列表(电话薄)

class SyncHook {
	constructor() {
		this.tasks = [];
	}
	tap(tag, fn) {
		this.tasks.push(fn);
	}
	call(...args) {
		this.tasks.forEach(function (task) {
			task(...args);
		});
	}	
}

let hook = new SyncHook();

2.3:使用发布订阅者模式

需求: 张三、李四去车店买了一辆兰博基尼,张三、李四预定(tap)了一辆 兰博基尼 价格 999999999 车店里没有货了,要等经理到货后通知(call)他们。

class SyncHook {
	constructor() {
		this.tasks = [];
	}
	tap(tag, fn) {
		this.tasks.push(fn);
	}
	call(...args) {
		this.tasks.forEach(function (task) {
			task(...args);
		});
	}	
}

let hook = new SyncHook();
hook.tap("张三", function (name, price) {
	console.log(name, price); // 兰博基尼 999999999
})

hook.tap("李四", function (name, price) {
	console.log(name, price); // 兰博基尼 999999999
})

hook.call("兰博基尼", 999999999);

2.4:发布订阅者优化

对发布订阅者模式优化参数进行校验
新增了 1 个属性:
| arg |
校验规则:
在 SyncHook 中传入一个数组这个数组就代表着能传递几个参数。
少于:报错
多于:截取数组个数对应的参数

class SyncHook {
	constructor(arg) {
		this.tasks = [];
		this.arg = arg;
	}
	tap(tag, fn) {
		this.tasks.push(fn);
	}
	call(...args) {
		if (args.length < this.arg.length) {
			throw new Error("参数个数不对")
		}
		args = args.slice(0, this.arg.length);
		this.tasks.forEach(function (task) {
			task(...args);
		});
	}	
}

let hook = new SyncHook([name, price]);
hook.tap("张三", function (name, price) {
	console.log(name, price); // 兰博基尼 999999999
})

hook.tap("李四", function (name, price) {
	console.log(name, price); // 兰博基尼 999999999
})

hook.call("兰博基尼", 999999999);




GOOD-BYE

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270209.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号