订阅模式
发布订阅模式或消息模式
这种模式一般会定义一个主体和众多的主体,这里主体可以想象为一个消息中心,里面有各种各样的消息,众多的个体可以订阅不同的消息,当未来消息中心发布某条信息的时候,订阅过他的个体就会得到通知。 ```javascript // 定义一个消息中心 var msgCenter = (function(){ var _msg = {}; // 存储消息 /*
var _msg = {
'carInfo': [person1.alreadRegister.carInfo,
person2.alreadRegister.carInfo],
‘newsInfo’: [person1.alreadRegister.newsInfo,
person3.alreadRegister.newsInfo]
} */ return { // 用于订阅一个消息 register: function(type, fn) { if(_msg[type]) {
_msg[type].push(fn);
}else {
_msg[type] = [fn];
} }, // 用于发布消息 fire: function(type, args) { if(!_msg[type]) { return ;} let event = {
type,
args: args || {} } _msg[type].forEach(item => {
item(event);
})
}, // 用于取消订阅消息 cancel: function(type, fn) { if(!_msg[type]) { return ;}
for(let i = 0;i < _msg[type].length; i++) {
if(_msg[type][i] === fn) {
_msg[type].splice(i, 1);
break;
} } } } })();
function Person() {
this.alreadyRegister= {}; // 存个体已经订阅过的消息
}
Person.prototype.register = function(type, fn) {
if(this.alreadyRegister[type]) {
console.log(“你已经订阅过这个消息了,请不要重复订阅”);
}else {
msgCenter.register(type, fn);
this.alreadyRegister[type] = fn;
}
}
Person.prototype.cancel = function(type) {
msgCenter.cancel(type, this.alreadyRegister[type]);
delete this.alreadyRegister[type];
}
var person1 = new Person(); var person2 = new Person(); var person3 = new Person();
person1.register(‘carInfo’, function(e) { console.log(“person1得到了关于” + e.type + ‘的消息,消息内容是:’ + e.args.info) }); person1.register(‘newsInfo’, function(e) { console.log(“person1得到了关于” + e.type + ‘的消息,消息内容是:’ + e.args.info) }); person2.register(‘carInfo’, function(e) { console.log(“person2得到了关于” + e.type + ‘的消息,消息内容是:’ + e.args.info) }); person3.register(‘newsInfo’, function(e) { console.log(“person3得到了关于” + e.type + ‘的消息,消息内容是:’ + e.args.info) });
msgCenter.fire(‘carInfo’, {info: ‘新款汽车上市’});
msgCenter.fire(‘newsInfo’, {info: ‘林俊杰又发新歌了’});
```