设计模式——观察者模式

目录

一、是什么

二、实现方式

三、使用场景

四、总结


一、是什么

老板(被观察者)需要做一件重要的事情,亲自告知所有下属(观察者)------哈哈哈,突然想到察言观色。

要点下属是老板底下的成员;老板通知后,下属需要各自履行自己的职责

二、实现方式

1.干活需要人 (添加被观察者): addObserver

2.老板通知干什么活 :notify

3.干什么活 (每个被观察者都需要实现):update

4.员工离职 :removeObserver

5.具体代码:

javascript 复制代码
/**
 * 观察者模式: 需要知道被观察者是谁;观察者和被观察者是多对一的关系,紧密耦合
 * 通过调用观察者的update方法来通知观察者
 * 
 */


/**
 * 被观察者(老板,任务)
 */
class Subject{
  observers=[];
  addObserver(observer){
   if(!this.observers.includes(observer)){
    this.observers.push(observer)
   }
  }
  removeObserver(observer){
    this.observers = this.observers.filter(o => o !== observer)
  }
  
  //通知:干活啦!!!
  notify(data){
    console.log('全体成员注意,',data)
    this.observers.forEach(observer => {
      if(typeof observer.update === 'function'){
        observer.update(data)
      }
    })
  }
}

/**
 * 观察者(下属,任务执行者1,任务执行者2)
 */
class Observer1{

  update(data){
    console.log(data,'Observer1 去买菜')
  }
}
class Observer2{
  update(data){
    console.log(data,'Observer2 去煮饭')
  }
}
const subject = new Subject()
const observer1 = new Observer1()
const observer2 = new Observer2()
subject.addObserver(observer1)
subject.addObserver(observer2)
subject.notify('12:00前要吃上饭!')

三、使用场景

1.从属关系(例如:老板和员工)

2.依赖关系 (例如:人和食物, computed,watch)

四、总结

1.观察者模式被观察者notify自己拥有的oberser,让observer干活

2.和发布订阅模式的区别

a.观察者模式 被观察者直接存储了观察者,可以直接调用观察者的方法------观察者被持有,观察者和被观察者必须同时存在,紧耦合;知道谁订阅了,代码可读性高,排查容易具体的执行由观察者自己执行。

b.发布订阅模式 发布者只存储了订阅者要干的活,不知道哪个实例订阅了------发布者只是中介,松耦合;不知道谁订阅了,错误排查比较困难,需要循环找到所有的回调并且执行

共同点都必须在不用的时候 手动调用removeObserver(cancelSubscribe),否则可能会造成 内存泄漏 !

/*

希望对你有帮助!

如有错误,欢迎指正,谢谢!

*/

相关推荐
星心源七境33 分钟前
七境体系全解析:从六韬兵法到AI锁颜,一套贯穿古典智慧与现代应用的成长操作系统
人工智能·设计模式·设计
qq_297574672 小时前
设计模式系列文章(基础篇第21篇):迭代器模式——遍历聚合解耦,实现统一迭代访问
设计模式·迭代器模式
禅思院4 小时前
前端请求取消与调度完全指南:从 AbortController 到企业级优先级架构
前端·设计模式·前端框架
小bo波4 小时前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
写代码的小阿帆5 小时前
行为型设计模式之观察者(发布-订阅)模式
设计模式
王_teacher6 小时前
23种设计模式全解析(GoF 设计模式)
设计模式·软考·软件设计师·软考中级
阿坤带你走近大数据7 小时前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
geovindu7 小时前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式
Anastasiozzzz8 小时前
构建健壮软件系统的基石:深入解析面向对象设计七大原则
开发语言·javascript·设计模式·ecmascript
qq_297574671 天前
设计模式系列文章(基础篇第19篇):中介者模式——封装交互关系,解耦网状依赖
设计模式·交互·中介者模式