我和小芳的故事-发布订阅模式

2019-11-01  本文已影响0人  原型设计
/**
 * 发布订阅者模式。
 *
 *  故事: 我和小芳去买房。
 * 
 * @class Publish
 */


 //  ================================  我和小芳同时订阅这家房地产      ===================================

class Publish {
  constructor(){
    this.home = [];
  }

  // 订阅
  listen(fn){
    this.home.push(fn);
  }

  // 发布
  trigger(){
    this.home.forEach(element => {
      element.apply(this,arguments);
    });
  } 
}

const ob = new Publish();

// 我订阅
ob.listen(function(...arg){
  console.log('me:',arg);
});

// 小芳订阅
ob.listen(function(...arg){
  console.log('xiaofang:',arg);
});

ob.trigger('尊敬的先生,今天有128平米的房子,你有兴趣嘛!');
ob.trigger('尊敬的小芳,今天有128平米的房子,你有兴趣嘛!');



 //  ================================  我和小芳只想收到自己订阅的消息      ===================================

class Publish {
    constructor(){
      this.home = [];
    }
  
    // 订阅
    listen(key,fn){
      if(!this.home[key]){
        this.home[key] = [];
      }

      this.home[key].push(fn);
    }
  
    // 发布
    trigger(){
      const key = Array.prototype.shift.call(arguments),fns = this.home[key];
      if(!fns || fns.length  === 0){
        return false;
      }
      fns.forEach(element => {
        element.apply(this,arguments);
      });
    } 

    // 移除
    remove(key,fn){
      const fns = this.home[key];
      if(!fns){
        return false;
      }

      this.home[key] =[];

      fn(this.home[key]);
    }
  }
  
  const ob = new Publish();
  
  // 我订阅
  ob.listen('88',function(...arg){
    console.log('me:',arg);
  });
  
  // 小芳订阅
  ob.listen('99',function(...arg){
    console.log('xiaofang:',arg);
  });
  
  ob.remove('88',function(e){
    console.log(e);
  });

  ob.trigger('88','尊敬的先生,今天有128平米的房子,你有兴趣嘛!');
  ob.trigger('88','尊敬的先生,今天有150平米的房子,你有兴趣嘛!');


  ob.trigger('99','尊敬的小芳,今天有128平米的房子,你有兴趣嘛!');



上一篇 下一篇

猜你喜欢

热点阅读