zoukankan      html  css  js  c++  java
  • javascript设计模式之观察者模式

    dom 的事件模式就是观察者模式

    /*
     * 观察者模式又叫发布者-订阅者模式
     * 我发布一则消息,消息就在那里;你若订阅,我便发送。
    */
    
    /*
     * js和dom之间的实现就是一种观察者模式;
     * 所有的dom元素都发布了事件,然后观察谁订阅了这个事件;
     * 例:div订阅了click事件
    */
    document.getElementById("banner").onclick = function () {
        alert("div is clicked!");
    };

    原生实现

    /*
     * js 观察者模式 又称 订阅/发布模式
     * 通过创建“可观察”对象,当发生一个感兴趣的事件时可将该事件通告给
     * 所有观察者,从而形成松耦合
    */
    var pubsub = (function () {
    
        var q = {},
            topics = {},
            subUid = -1;
    
        // 发布方法
        q.publish = function (topic, args) {
    
            if (!topics[topic]) {
                return false;
            }
    
            var subscribers = topics[topic],
                len = subscribers ? subscribers.length : 0;
    
            while (len--) {
                subscribers[len].func(topic, args);
            }
    
            return true;
        };
    
        // 订阅方法
        q.subscribe = function (topic, func) {
    
            if (!topics[topic]) {
                topics[topic] = [];
            }
    
            var token = (++subUid).toString();
    
            topics[topic].push({
                token: token,
                func: func
            });
    
            return token;
        };
    
        //退订方法
        q.unsubscribe = function (token) {
            for (var m in topics) {
                if (topics[m]) {
                    for (var i = 0, j = topics[m].length; i < j; i++) {
                        if (topics[m][i].token === token) {
                            topics[m].splice(i, 1);
                            return token;
                        }
                    }
                }
            }
            return false;
        };
    
        return q;
    })();
    
    
    pubsub.subscribe("broadcast", function (topic, data) {
        console.log(topic + " : " + data);    // broadcast : hello world
    });
    
    pubsub.publish("broadcast", "hello world");

    jQuery版本

    // jquery 版本
    (function ($) {
    
        var o = $({});
    
        // 订阅既是事件绑定(观察者)
        $.subscribe = function () {
            o.on.apply(o, arguments);  // on
        };
    
        $.unsubscribe = function () {
            o.off.apply(o, arguments);
        };
    
        // 发布既是事件触发
        $.publish = function () {
            o.trigger.apply(o, arguments);  // trigger
        };
    } (jQuery));
    
    $.subscribe("j-bro", function (e, data) {
        console.log(data);    // jquery broadcast
    });
    
    $.publish("j-bro", "jquery broadcast");
    $.publish("j-bro", "jquery broadcast again");
  • 相关阅读:
    函数式编程与命令式编程的学习难度比较
    Swfit4.0中JSON与模型原生互转(JSONEncoder/JSONDecoder的使用)
    元类型与类型的区别
    Swift
    swift类型操作规范
    PHP实现执行定时任务的几种思路详解
    基于ThinkPHP与阿里大于的PHP短信验证功能
    laravel中将session由文件保存改为数据库保存
    laravel5.*安装使用Redis以及解决Class 'PredisClient' not found和Fatal error: Non-static method Redis::set() cannot be called statically错误
    Python基础知识汇总
  • 原文地址:https://www.cnblogs.com/xiankui/p/3964301.html
Copyright © 2011-2022 走看看