设计模式——观察者模式

目录

一、是什么

二、实现方式

三、使用场景

四、总结


一、是什么

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

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

二、实现方式

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),否则可能会造成 内存泄漏 !

/*

希望对你有帮助!

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

*/

相关推荐
朱一头zcy13 分钟前
设计模式入门:最简单的单例模式
笔记·单例模式·设计模式
kuntli17 分钟前
23种设计模式全解析
设计模式
海特伟业16 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight16 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区18 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行18 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥19 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行20 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行20 小时前
观察者设计模式全方位深度解析
设计模式