发布-订阅模式/观察者模式

举个现实中的例子,小明到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);

推荐阅读更多精彩内容