美文网首页
发布订阅者模式

发布订阅者模式

作者: 俊滔_b059 | 来源:发表于2018-09-25 17:18 被阅读20次

    发布/订阅模式使用位于希望接收通知的对象(订阅者)和发起事件的对象(发布者)之间的主题/事件频道。这个事件系统允许代码定义特定于应用程序的事件,这些事件可以传递包含订户所需值的自定义参数 这里的想法是避免用户和发布者之间的依赖关系。这里和观察者模式就不一样了。侧重点在于订阅者订阅事件,发布者发布信息,至于订阅者接受信息之后的处理并不关心。但是这个地方的问题在于Subject已经是项目的一个实实在在的构成部分,它不再是一个去规范行为的东西。这也是为什么一开始说是一种架构模式。
    (参考全文地址请点击:https://blog.csdn.net/it_rod/article/details/79516578?utm_source=copy )

    (function($) {
        var topics = {};
        $.publish = function(topic, args) {
            debugger
            if (topics[topic]) {
                var currentTopic = topics[topic],
                args = args || {};
        
                for (var i = 0, j = currentTopic.length; i < j; i++) {
                    currentTopic[i].call($, args);
                }
            }
        };
        $.subscribe = function(topic, callback) { 
            if (!topics[topic]) {
                topics[topic] = [];
            }
            topics[topic].push(callback);
            return {
                "topic": topic,
                "callback": callback
            };
        };
        $.unsubscribe = function(handle) {
            var topic = handle.topic;
            if (topics[topic]) {
                var currentTopic = topics[topic];
        
                for (var i = 0, j = currentTopic.length; i < j; i++) {
                    if (currentTopic[i] === handle.callback) {
                        currentTopic.splice(i, 1);
                    }
                }
            }
        };
    })(jQuery);
    

    其他写法:

    var pubsub = (function(){
        var q = {}
            topics = {},
            subUid = -1;
        //发布消息
        q.publish = function(topic, args) {
            if(!topics[topic]) {return;}
            var subs = topics[topic],
                len = subs.length;
            while(len--) {
                subs[len].func(topic, args);
            }
            return this;
        };
        //订阅事件
        q.subscribe = function(topic, func) {
            topics[topic] = topics[topic] ? topics[topic] : [];
            var token = (++subUid).toString();
            topics[topic].push({
                token : token,
                func : func
            });
            return token;
        };
        return q;
        //取消订阅就不写了,遍历topics,然后通过保存前面返回token,删除指定元素
    })();
    //触发的事件
    var logmsg = function(topics, data) {
        console.log("logging:" + topics + ":" + data);
    }
    //监听指定的消息'msgName'
    var sub = pubsub.subscribe('msgName', logmsg);
    //发布消息'msgName'
    pubsub.publish('msgName', 'hello world');
    //发布无人监听的消息'msgName1'
    pubsub.publish('anotherMsgName', 'me too!');
    

    相关文章

      网友评论

          本文标题:发布订阅者模式

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