观察者模式与订阅发布模式

2019-01-07  本文已影响0人  Mr无愧于心

订阅发布模式

function Event(){
  this.events=[];
}
Event.prototype.on=function(fn){    //订阅
  this.events.push(fn);
}
Event.prototype.emit=function(data){    //发布
  this.events.forEach(function(fn){
    fn(data);
  })
}
  1. 处理异步(不好用)
//eg:  读完这两个txt才能执行
let schoolInfo = {},event=new Event;
event.on(function () {
  if (Object.keys(schoolInfo).length === 2){
    console.log(schoolInfo)
  }
});
fs.readFile('./name.txt','utf8',function (err,data) {
  schoolInfo['name'] = data;
  event.emit();
});
fs.readFile('./age.txt', 'utf8', function (err, data) {
  schoolInfo['age'] = data;
  event.emit();
});
  1. vue子组件向父组件发射数据

观察者模式

function Subject() { // 我家孩子的类
  this.observers = [];
  this.state = '开心';
}
Subject.prototype.attach = function (observer) {
  this.observers.push(observer);
}
Subject.prototype.setState = function (state) {
  this.state = state;
  this.notify();
}
Subject.prototype.notify = function () {
  this.observers.forEach(function (observer) {
    observer.update();
  })
}
function Observer(name,target){ // 观察者 一般会有一个方法
  this.name = name;
  this.target = target;
}
Observer.prototype.update = function () { // 更新方法
  console.log(`通知:${this.name} 当前的状态是 ${this.target.state}赶紧哄`)
  }
let subject = new Subject();
let observer1 = new Observer('丈夫', subject);
let observer2 = new Observer('媳妇', subject);
subject.attach(observer1); // 给目标添加观察者
subject.attach(observer2);
subject.setState('不开心');

孩子是被观察者,父母是观察者,被观察者状态变化,就通知观察者做某件事

  1. vue 数据变化通知视图更新
上一篇下一篇

猜你喜欢

热点阅读