设计模式——观察者模式

目录

一、是什么

二、实现方式

三、使用场景

四、总结


一、是什么

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

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

二、实现方式

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

/*

希望对你有帮助!

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

*/

相关推荐
小码过河.6 小时前
设计模式——责任链模式
设计模式·责任链模式
sg_knight8 小时前
抽象工厂模式(Abstract Factory)
java·python·设计模式·抽象工厂模式·开发
短剑重铸之日9 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
J_liaty10 小时前
23种设计模式一抽象工厂模式‌
设计模式·抽象工厂模式
短剑重铸之日11 小时前
《设计模式》第一篇:初识
java·后端·设计模式
酉鬼女又兒1 天前
java三个工厂设计模式
java·开发语言·设计模式
Engineer邓祥浩1 天前
设计模式学习(26) 总结(杂想)
java·学习·设计模式
奔跑的web.1 天前
前端使用7种设计模式的核心原则
前端·javascript·设计模式·typescript·vue
钦拆大仁2 天前
Java设计模式-单例模式
java·单例模式·设计模式