美文网首页
观察者模式

观察者模式

作者: 黄小猛 | 来源:发表于2017-03-18 14:23 被阅读0次

    观察者模式

    var Observer = (function () {
        var _message = {};
    
        return {
            // 注册消息
            register: 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 || {},
                };
    
                for (var i = 0; i < _message[type].length; i++) {
                    // 依次执行注册的消息对应的动作序列
                    _message[type][i].call(this, events);
                }
            },
    
            // 取消订阅
            remove: function (type, fn) {
                // 消息队列存在
                for (var i = _message[type].length - 1; 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.answer = function (question) {
            Observer.register(question, this.say);
        };
    
        Student.prototype.sleep = function (question) {
            console.log(this.result + '  ' + question + '已被注销');
            Observer.remove(question, 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.answer('什么是设计模式');
        student2.answer('什么是设计模式');
        student2.answer('什么是前端');
        student2.answer('什么是js');
        student3.answer('什么是js');
    
        // 后来学生3睡着了
        student3.sleep('什么是js');
    
        var teacher = new Teacher();
        teacher.ask('什么是设计模式');
        teacher.ask('什么是前端');
        teacher.ask('什么是js');

    相关文章

      网友评论

          本文标题:观察者模式

          本文链接:https://www.haomeiwen.com/subject/knvunttx.html