设计模式之观察者模式

//定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变的时候,所有依赖于他的对象都得到通知并自动刷新

// 观察者放在闭包,页面加载就立即执行
var Observer = (function(){
    //消息队列私有
    var _message = {};
    return {
        //注册信息
        regist:function(type,fn){
            //一种类型对应多个模块注册的执行函数
            if(typeof _message[type] === "undefined"){
                _message[type] = [fn];
            }else{
                _message[type].push(fn);
            }
        },
        //发布信息
        fire:function(type,args){
            if(!_message[type]){
                return;
            }
            var events = {
                type:type,
                args:args || {}
            };
            var i = 0;
            var len = _message[type].length;
            for(; i<len;i++){
                //依次执行注册的消息对应的执行函数
                _message[type][i].call(this, event);
            }
        },
        //移除信息
        remove:function(type,fn){
            if(_message[type] instanceof Array){
                var i = _message[type].length - 1;
                for(; i>0;i--){
                    _message[type][i] === fn && _message[type].splice(i,1);
                }
            }
        }
    }
})();
var Student = function(result){
    var that = this;
    that.result =  result;
    that.say = function(){
        console.log(that.result);
    }
}

Student.prototype.choose = function(course){
    Observer.regist(course,this.say);
}

Student.prototype.unchoose = function(course){
    console.log(this.result + " " + course + "已经退选");
    Observer.remove(course,this.say);
}

var Teacher = function(){}

Teacher.prototype.ask = function(question){
    console.log("谁选了:" + question);
    Observer.fire(question);
}

var student1 = new Student("学生1选修");
var student2 = new Student("学生2选修");
var student3 = new Student("学生3选修");

student1.choose("数学");
student1.choose("历史");
student2.choose("计算机");
student3.choose("数学");
student3.choose("历史");

student3.unchoose("历史");

var teacher = new Teacher();
teacher.ask("数学");
teacher.ask("历史");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值