设计模式 - 发布订阅模式

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 - 发布订阅模式相关的知识,希望对你有一定的参考价值。

// 定义一家猎人工会
// 主要功能包括任务发布大厅 (topics) ,
// 以及订阅任务 (subscribe) ,
// 发布任务 (publish)
let HunterUnion = {
	type: 'hunt',
	// 任务发布大厅
	topics: Object.create(null),

	// 订阅任务 (subscribe)
	subscribe: function(topic, fn) {
		if (!this.topics[topic]) {
			this.topics[topic] = [];
		}

		this.topics[topic].push(fn);
	},

	// 发布任务 (publish)
	publish: function(topic, money) {
		if (!this.topics[topic]) return;

		for (let fn of this.topics[topic]) {
			fn(money);
		}
	}
};

// 定义一个猎人类
// 包括姓名,级别
function Hunter(name, level) {
	this.name = name;
	this.level = level;
};

// 猎人可在猎人工会发布订阅任务
Hunter.prototype.subscribe = function(topic, fn) {
	console.log(this.level + '猎人' + this.name + '订阅了狩猎' + topic + '的任务。');
	HunterUnion.subscribe(topic, fn);
};

Hunter.prototype.publish = function(topic, money) {
	console.log(this.level + '猎人' + this.name + '发布了狩猎' + topic + '的任务。');
	HunterUnion.publish(topic, money);
};

// 猎人工会走来了几个猎人
let hunterMing = new Hunter('小明', '黄金');
let hunterJin = new Hunter('小金', '白银');
let hunterZhang = new Hunter('小张', '黄金');
let hunterPeter = new Hunter('Peter', '青铜');

// 小明,小金,小张分别订阅了狩猎 tiger 的任务
hunterMing.subscribe('tiger', function(money) {
	console.log('小明表示:' + (money > 200 ? '' : '不') + '接取任务。');
});

hunterJin.subscribe('tiger', function(money) {
	console.log('小金表示:接取任务。');
});

hunterZhang.subscribe('tiger', function(money) {
	console.log('小张表示:接取任务。');
});

// Peter 订阅了狩猎 sheep 的任务
hunterPeter.subscribe('sheep', function(money) {
	console.log('Peter表示:接取任务。');
});

// Peter 发布了狩猎 tiger 的任务
hunterPeter.publish('tiger', 198);

// 猎人们发布 (发布者) 或订阅 (观察者/订阅者) 
// 任务都是通过猎人工会 (调度中心) 关联起来的,
// 他们没有直接的交流。

以上是关于设计模式 - 发布订阅模式的主要内容,如果未能解决你的问题,请参考以下文章

EventBus发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )

从发布-订阅模式到消息队列

订阅发布模式概念基础

《 javascript 设计模式与开发实践 》 ---发布-订阅模式 代码小问题

ActiveMQ入门系列三:发布/订阅模式

JS 设计模式八 -- 发布订阅者模式