观察者模式

观察者模式(Observer):又被称作发布-订阅者模式或消息机制,定义了一种依赖关系,解决了主题对象与观察者之间的功能的耦合。

创建观察者对象,有一个消息容器,三个方法:订阅消息方法,取消订阅方法,发送订阅的消息方法

// 将观察者放在闭包中,当页面加载就立即执行
var Observer = (function(){
    //防止消息队列被暴漏而被篡改所以将消息容器作为静态私有变量保存
    var __messages = {};
    return {
        //注册信息接口
        regist :function(){},
        //发布信息接口
        fire : function(){},
        //移除信息接口
        remove : function(){}
    }
})()

1.注册regist

注册方法的作用是将订阅者注册的消息推入到消息队列中。接收两个参数:消息类型以及响应的处理动作,在推入消息队列时如果消息不存在,则创建一个该消息类型并将消息放入消息队列中,如果存在则应该将消息执行方法推入该消息对应的执行方法队列中,目的是保证多个模块注册同一消息能顺利执行。

regist : function(type,fn){
    //如果消息不存在则创建一个该消息类型
    if(typeof __message[type] === 'undefined'){
        //将动作推入到该消息对应的动作执行队列中
        __messages[type] = [fn];
    }else{
        __messages[type].push(fn);
    }
}

2.发布fire

发布消息方法,功能是当观察者发布一个消息时将所有订阅者订阅的消息依次执行。接收两个参数:消息类型以及动作执行时需要传递的参数,消息类型是必须的,在执行消息动作队列之前校验消息的存在很有必要,然后遍历消息执行方法队列,依次执行,将消息类别以及传递的参数打包后一次传入消息执行方法中。

fire : function(type,args){
    //如果消息没有被注册,则返回
    if(!__messages[type]) return;
    //定义消息信息
    var events = {
        type : type,
        args : args || {}
    }
    // 遍历消息动作
    for(var i=0;i<__messages[type].length;i++){
        // 依次执行注册的消息对应的动作序列
        __messages[type][i].call(this,events);
    }
}

3.移除remove

移除注销方法,功能是将订阅者注销的信息从消息队列中清除,也需要两个参数:消息类型以及执行的某一动作,为了避免删除消息动作时消息不存在情况的出现,对消息队列中消息的存在性校验也是很有必要的。

remove : function(type,fn){
    //如果不存在就直接return
    if(!__messages[type]) return;
    //从最后一个消息动作遍历
    for(var i=__messages[type].length-1;i>=0;i--){
        __message[type][i] === fn && __messages[type].splice(i,1);
    }
}

观察者模式可以解决团队开发中最重要的模块间通信问题,是模块间解耦的一种可行方案。

设计模式 文章被收录于专栏

设计模式

全部评论

相关推荐

身边有人上海、深圳&nbsp;6、7k&nbsp;都去了,真就带薪上班了。
程序员小白条:木的办法, 以后越来越差,还是家附近宅着吧,毕业的人越来越多,岗位都提供不出来,经济又过了人口红利期
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
我是没经验的毕业生,这啥情况啊会不会是hr在刷kpi
JamesGosli...:字节boss属于是群发了,我都快入职字节了,其他部门还在和我boss打招呼
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务