发布-订阅者模式

发布-订阅者模式

原理

  它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知

优点

  • 时间上的解耦
  • 对象之间的解耦

缺点

  • 创建订阅者本身要消耗一定的时间和内存
  • 对象与对象之间的必要联系难以跟踪与维护
/*******************发布者订阅者模式**********************************/
function Observer() {
  this.cache = []; // 订阅者列表
}
/**
 * 添加订阅者订阅事件
 * @param     {[type]}   event 订阅的事件名称
 * @param     {[type]}   fn 订阅者的回调事件
 */
Observer.prototype.listen = function(event, fn) {
  if (!this.cache[event]) {
    // 证明存在这个事件
    this.cache[event] = [];
  }
  this.cache[event].push(fn);
};
/**
 * 删除订阅者订阅事件
 * @param     {[type]}   event 订阅的事件名称
 * @param     {[type]}   fn 订阅者
 */
Observer.prototype.remove = function(event, fn) {
  let current = this.cache[event];
  if (current && current.length > 0) {
    if (fn) {
      this.cache[event] = current.filter(item => item !== fn);
    } else {
      this.cache[event] = [];
    }
  }
};
/**
 * 发布者发布信息
 * @param     {[type]}   event 订阅的事件名称
 * @param     {[type]}   fn 订阅者
 */
Observer.prototype.trigger = function(event, fn) {
  // 一般第一次都为事件的类型
  let event = [].shift.apply(arguments);
  let fns = this.cache[event];
  if (!fns || fns.length === 0) return false;
  fns.forEach(fn => {
    fn.apply(this, arguments); // 发送消息附带的参数
  });
};

let obs = new Observer();
// 添加事件订阅者
obs.listen(
  "send100",
  (fn1 = (a, b) => {
    console.log("小名", a, b);
  })
);
obs.listen(
  "send100",
  (fn2 = (a, b) => {
    console.log("小红", a, b);
  })
);
obs.remove("send100", fn2);
obs.trigger("send100", 30000, 400000);

 上一篇
迭代器模式 迭代器模式
迭代器模式原理  指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示 用途  可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。 内部迭代器  
2018-06-05
下一篇 
设计模式 设计模式
设计模式主题  将不变的部分和变化的部分隔开 原则 单一职责原则(SRP) 一个对象(方法)只做一件事情 => 应该只有一个原因而引起方法或者对象的改变 何时应该分离职责: 当跟着需求的变化,两个职责同时变化,就可以不必分离.
2018-06-04
  目录