发布订阅和观察者模式

目的

  • 实现发布订阅和观察者模式

发布订阅

  • 核心就是创造一个事件处理中心,将订阅的任务在任务完成是发布出去,这样说很模糊,代码比较直观
//发布订阅
let events = {
  _events: [],
  //收集要处理的任务
  on(fn) {
    this._events.push(fn);
  },
  //发布执行已收集的任务(方法)
  emit(data) {
    this._events.forEach((event) => {
      event(data);
    });
  },
};
setTimeout(() => {
  //发布
  events.emit("第一次舔");
}, 1000);
setTimeout(() => {
  //发布
  events.emit("第二次舔");
}, 2000);
//订阅
events.on((data) => {
  arr.push(data);
  console.log(data);
});
let arr = [];
events.on(() => {
  if (arr.length === 2) {
    console.log("老子不舔了");
  }
});

观察者模式

  • 存在一个观察者,一个被观察者,当被观察者变化时通知观察者,
  • 要实现上面的功能就需要被观察者将所有的观察者收集起来
  • 代码如下
class Subject {
  constructor(name) {
    this.name = name;
    this.state = "非常开心";
    this.observers = [];
  }
  attach(o) {
    this.observers.push(o);
  }
  setState(newState) {
    this.state = newState;
    this.observers.forEach((o) => {
      o.update(this.name, newState);
    });
  }
}

class Observer {
  constructor(name) {
    this.name = name;
  }
  update(s, state) {
    console.log(this.name, s + "当前" + state);
  }
}
let s = new Subject("小宝宝");
let o1 = new Observer("爸爸");
let o2 = new Observer("妈妈");
s.attach(o1);
s.attach(o2);
s.setState("不开心了");
s.setState("开心了");

最重要的就是被观察者里的attach要将观察者收集起来,状态改变时setState方法要调用观察者的update方法进行通知
发布日期:
分类:js

发表评论

您的电子邮箱地址不会被公开。