zoukankan      html  css  js  c++  java
  • 设计模式

    观察者模式(发布订阅)

      定义了一种一对多的关系(以发布者的一个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);

      

    转载请注明出处
    水平有限,错误在所难免,抛砖引玉,意在交流学习
  • 相关阅读:
    libxml2.7.8 c++ 解析xml文件
    Head First设计模式-模板方法模式
    嵌入式开发之工具移植--openssl移植
    嵌入式开发之工具移植--wpa_suppliant工具的移植和使用
    linux下嵌入式wifi开发工具移植
    IOS面试题(英文)
    机器学习学习笔记 PRML Chapter 2.0 : Prerequisite 1
    机器学习学习笔记 PRML Chapter 2.0 : Prerequisite 2 -Singular Value Decomposition (SVD)
    CCJ PRML Study Note
    CCJ PRML Study Note
  • 原文地址:https://www.cnblogs.com/wenhandi/p/7844563.html
Copyright © 2011-2022 走看看