发布-订阅模式

发布-订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。

例子一 售楼和买房的情况

  var salesOffices = {};//定义售楼处

    salesOffices.clientList = {};//缓存列表,存放订阅者的回调函数

    salesOffices.listen = function(key,fn){
        if(!this.clientList[key]){//如果还没有订阅过此类消息,给该类消息创建一个缓存列表
            this.clientList[key] = [];
        }
        this.clientList[key].push(fn);//订阅的消息添加进消息缓存列表
    };

    salesOffices.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);
        }

    };

    salesOffices.listen('squareMeter88',function(price){
        console.log('价格= ' + price);
    });
    salesOffices.listen('squareMeter100',function(price){
        console.log('价格= ' + price);
    });

    salesOffices.trigger('squareMeter88',2000000);
    salesOffices.trigger('squareMeter100',4000000);
    salesOffices.trigger('squareMeter100',8000000);

如果现在有多个售楼处都需要这个功能,我们可以把发布-订阅功能提取出来,每次要添加售楼处的时候,把里面的方法和属性都复制到新的售楼处里面就行了

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.trigger('squareMeter88',1000); 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发布订阅模式 发布/订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依...
    自度君阅读 2,004评论 0 2
  • 发布/订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都...
    风铭阅读 2,716评论 0 1
  • 某皮神就快一周岁了! 生命这玩意真是神奇,如果你仔细睁大眼睛看,每个阶段都无比绝伦。 有时就像雨后的竹笋,隔夜醒来...
    盖子团长阅读 584评论 1 1
  • 陌上一朵两生花, 一朵是我, 一朵是你。 一朵是晨曦里伴朝霞升起的皎日, 一朵是夜空中被轻云遮蔽的明月; ...
    小毛豆_9357阅读 355评论 1 2
  • 人的心 不是所谓慢慢就看到了的 而是 在别人的口中诉说 然后自己看到 这样才算的上真正的慢慢看到 你以为的坚不可摧...
    loole阅读 149评论 0 0