设计模式——观察者模式

目录

一、是什么

二、实现方式

三、使用场景

四、总结


一、是什么

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

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

二、实现方式

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

/*

希望对你有帮助!

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

*/

相关推荐
c++之路1 天前
观察者模式(Observer Pattern)
java·网络·观察者模式
货拉拉技术1 天前
私域转化率翻倍的秘密:我们把多模态Agent融进了私域营销
人工智能·算法·设计模式
看山是山_Lau1 天前
抽象工厂模式:一整套对象族如何统一创建?
设计模式·抽象工厂模式
木易 士心1 天前
深入理解 OKHttp:设计模式、核心机制与架构优势
android·设计模式·架构
likerhood1 天前
设计模式 · 外观模式(Facade Pattern)
设计模式·外观模式
++==1 天前
设计模式:单例模式和观察者模式实现方式以及优化
观察者模式·单例模式·设计模式
doubledong19941 天前
分形世界与设计模式
设计模式
多加点辣也没关系1 天前
设计模式-访问者模式
设计模式·访问者模式
咖啡八杯1 天前
GoF设计模式——原型模式
java·后端·设计模式·原型模式