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

订阅发布模式

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

  • 一张图说明


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

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 数据变化通知视图更新
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先,个人觉得观察者模式和订阅-发布模式是有区别的(一些文章会认为观察者模式即为订阅-发布模式),然后分别介绍一下...
    BULL_DEBUG阅读 504评论 0 0
  • 1.初识观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被...
    王侦阅读 906评论 0 1
  • 一、观察者模式和发布订阅模式简介 1.1 观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监...
    不知蜕变的挣扎阅读 1,819评论 1 1
  • 我本是天上肆意风流的云,什么时候坠入凡间,不解风情; 我本是山间不被羁绊的风,什么时候散入人间,存在突兀; 我本是...
    DINW阅读 205评论 0 1
  • 教育是我们每一个人都关心的话题!为什么每个人都关心呢?!因为它破朔迷离,没有正解,但又与你的生活息息相关,密不可分...
    海阔天空看天下阅读 200评论 0 0