设计模式之《观察者模式》

288 阅读3分钟

一直对观察者模式有一些混淆,

今天总结记录一下

下面从将说理列(讲概念,说用途,理核心设计思路,列优缺点)面入手,讲明白其中的内容

概念趴:

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。

观察者模式通常由两类对象组成:主题(Subject)和观察者(Observer)。主题维护一个观察者列表,当主题的状态发生变化时,它会通知列表中的所有观察者进行更新。

主题维护一个观察者列表和提供添加,删除,通知的功能接口;观察者自身维护一个更新的方法,

核心设计思路:

定义一种一对多的依赖关系,即让多个观察者对象同时监听一个主题对象,当主题对象状态发生变化时,它会自动通知所有观察者进行更新

使用场景:

  • 当一个对象的状态发生变化时需要通知其他多个对象进行更新
  • 当一个对象需要在状态变化时执行一些操作,但这些操作和对象本身无关时
  • 当一个对象需要通知其他对象,但又希望它们能够自由地添加或移除自己时 在实现上,可以使用订阅-发布模式或者回调函数来实现

使用观察者模式可以实现松耦合的设计,让主题和观察者之间的耦合度更低,提高代码的灵活性和可维护性。它可以用于许多场景,例如实现事件处理、模型-视图-控制器(MVC)模式、GUI编程等等

优缺点:

优点

  • 观察者模式实现松耦合的设计,主题对象和观察者对象之间的依赖度更低,可以提高代码的灵活性和可维护性
  • 观察者模式可以实现一对多的依赖关系,当主题对象状态发生变化时,所有观察者对象都可以自动更新,从而避免了手动维护对象状态的复杂性

缺点

  • 观察者模式可能会导致性能问题,当观察者数量很多时,主题对象状态变化时需要通知所有观察者进行更新,这可能会消耗大量的时间和内存
  • 如果观察者对象和主题对象之间的关系不够清晰,可能会导致代码难以理解和维护

image.png

// 定义一个主题对象
class Subject{
  constructor(){
    this.observers = []; // 维护一个观察者队列
  }
  // 有添加,移除,通知接口

  // 添加观察者
  addObserver(observer){
    this.observers.push(observer)
  }

  // 移除
  removeObserver(observer){
    let index = this.observers.indexOf(observer)
    if(index > -1){
      this.observers.splice(index, 1)
    }
  }

   // 通知观察者
  notify(msg){
    this.observers.forEach(observer => {
      // 观察者自己内部的处理更新数据的方法
      observer.update(msg)
    })
  }
}


// 定义一个观察者对象
class Observer{
  constructor(name){
    this.name = name; 
  }

  // 接收通知并进行处理
  update(msg){
    // do something
     console.log(`[${this.name}] received message: ${message}`);
  }
}

//  使用示例
const subject = new Subject();
// 创建两个观察者对象
const observer1 = new Observer('Observer1');
const observer2 = new Observer('Observer2');


// 将观察者添加到主题对象的观察者列表中
subject.addObserver(observer1);
subject.addObserver(observer2);

// 发送通知
subject.notify('Hello World');


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天 点击查看详情