• 设计模式


    观察者模式(发布订阅)

      定义了一种一对多的关系(以发布者的一个topic为出发点,1个发布者可对应多个订阅者)。JS里的观察者模式功能通过回调来实现。

      topics多个话题的对象

        topic一个话题(是数组,为支持多个订阅者订阅相同topic)

      publish:若有topic的话,执行相关topic回调

      subscribe:约定唯一的topic和对应回调函数,返回唯一token

      举个例子: 杂志社(发布者)支持个性化(订阅者确定,订阅者是发起者)订阅杂志,订阅者李明想订阅关于篮球巨星“勒布朗詹姆斯的私生活”(topic),用做自己公众号的素材(回调函数)。小刚也想订阅,出于好奇(回调函数)。订阅产生一个唯一id(token)可以区分同一topic的不同订阅者,取消订阅时可用。

      注:与现实生活中不同的是,杂志社的个性化订阅服务是瞬间完成的,订阅者要,发布者就会给。

    // 观察者(发布订阅模式)
    var pubsub = {};
    (function(q){
        var topics = {}, subUid = -1;
        // 发布方法,订阅方法执行后可执行
        q.publish = function(topics, args){
         //发布者不是手发者,只发布订阅过得topic
    if(!topics[topic]){ return false; } setTimeout(function(){ var subscribes = topics[topic], len = subscribes.length; while(len--){
              // 循环执行topic对应的回调 subscribes[len].func(topic, args); } },
    0) return true; }; // 订阅方法,调用时先执行 q.subscribe = function(topic, func){ if(!topics[topic]){
           //每个topic都是数组为了支持多个订阅者 topics[topic]
    = []; } var token = (++subUid).toString();
         //把回调函数和token加到公共变量 topics[topic].push({ token: token, func: func });
         //返回唯一token,用于取消订阅
    return token; }; // 退订方法 q.unsubscribe = function(){ for(var m in topics){ for(var i =0, j= topics[m].length; i<j; i++){ if(topics[m][i].token === token){
                //使用数组方法删除token对应的topic topics[m].splice(i,
    1); return token; } } } return false; }; })(pubsub);

      

    转载请注明出处
    水平有限,错误在所难免,抛砖引玉,意在交流学习
  • 相关阅读:
    SpirngBoot整合Mybatis Plus多数据源
    SpringBoot整合EasyPoi 封装Excel导出通用工具类,行高自适应,导出图片
    阿里云服务器安装Docker Compose
    设置Docker容器里的时间
    坏代码导致的性能问题大赏:CPU占用飙到了900%!
    Java程序员涨薪必备的性能调优知识点,收好了!
    SprinMvc快速入门
    python中文乱码问题
    python中自定义函数类的引用(最全)
    datax
  • 原文地址:https://www.cnblogs.com/wenhandi/p/7844563.html
Copyright © 2020-2023  润新知