举个现实中的例子,小明到A开发商那买一套房子,碰巧现在没房,售楼处答应在有房子的时候通知小明。这时,小明就订阅了售楼处的消息,售楼处负责发布消息。这就是一个很好的发布=订阅模式。售楼处和小明并不需要强耦合在一起。现在用代码模式实现这一过程。
//订阅发布功能
var event = {
clientList: [],
listen: function(key, fn) {
if(!this.clientList[key]) {
this.clientList[key] =[];
}
this.clientList[key].push(fn);
},
trigger: function() {
var key = Array.prototype.shift.call(arguments),
fns = this.clientList[key];
if(!fns || fns.length ===0) {
return false;
}
for(var i=0,fn; fn=fns[i++]; ) {
fn.apply(this, arguments);
}
}
};
//定义一个函数给所有对象安装发布=订阅功能
var installEvent = function(obj) {
for(var i in event) {
obj[i] = event[i];
}
};
//测试一下
var salesOffices = {};
installEvent(salesOffices);
salesOffices.listen('squareMeter88', function(price) {
console.log('价格=' + price);
});
salesOffices.listen('squareMeter100', function(price) {
console.log('价格=' + price);
});
salesOffices.trigger('squareMeter88',2000000);
salesOffices.trigger('squareMeter100',300000);