概述
订阅发布者模式如果不进行细腻度的划分也有称之为消息通信模式、中介模式或者观察者模式。故名思意需要有订阅和发布,当订阅了某一个事件后,通过发布操作可以通知到所有的订阅者执行相关操作。
实现
要完成订阅发布者模式,首先需要一个中介或者说叫做观察者:
var Observe = {}; //这是一个观察者,所有的操作都由它来执行,可以将其定义为一个object
其次就是需要一个保存订阅消息的容器:
//由于需要一个内部私有容器来保存消息,所以需要将其改变下结构
var Observe = (function () {
var _message = {}; //用于保存订阅消息的容器
}());
最后就是需要有的操作,包括但不限于订阅操作和发布操作:
var Observe = (function () {
var _message = {};
return {
register: function () {}, //订阅操作
publish: function () {} //发布操作
}
}());
然后完善一下订阅和发布的具体操作了:
var Observe = (function () {
var _message = {};
return {
register: function (type, fn) { //消息类型type,对应操作fn
if (_message[type]) { //消息容器中有对应的type,直接往队列中添加
_message[type].push(fn);
} else { //消息容器中没有对应的type,则先创建队列,再添加
_message[type] = [];
_message[type][0] = fn;
}
},
publish: function (type) {
if (_message[type]) {
_message[type].forEach(item => {
typeof item === 'function' && item();
});
}
}
}
}());
到这里,一个简单的订阅发布者模式构就建好了。
测试
Observe.register("SayHi", function () { console.log('Hi, I am the first.'); });
Observe.register("SayHi", function () { console.log('Hi, I am the second.'); });
Observe.register("SayHi", function () { console.log('Hi, I am the three.'); });
Observe.register("SayHello", function () { console.log('Hello, I am the four.'); });
Observe.publish("SayHi");
//输出为
//Hi, I am the first.
//Hi, I am the second.
//Hi, I am the three.