美文网首页
观察者模式与订阅发布模式

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

作者: Mr无愧于心 | 来源:发表于2019-01-07 14:04 被阅读0次

订阅发布模式

  • 举个例子:比如你订阅邮箱报纸,他会不定期给你发送,当你想看的时候,你打开邮箱就能看所有的报纸(按订阅顺序)。
    那么订阅报纸就是订阅,读报纸就是发布

  • 一张图说明


    订阅发布
  • 代码说明
    // 核心事件 中介

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 数据变化通知视图更新

相关文章

网友评论

      本文标题:观察者模式与订阅发布模式

      本文链接:https://www.haomeiwen.com/subject/eisinftx.html