Observer 模式简介

举报
i-WIFI 发表于 2025/04/28 18:54:58 2025/04/28
【摘要】 Observer 模式(也称为发布-订阅模式)是一种设计模式,用于实现对象之间的松耦合通信。在这种模式下,一个对象(称为Subject或Publisher)维护一组依赖它的对象(称为Observers或Subscribers),并在状态发生变化时通知它们。这使得系统中的组件能够独立变化,同时保持彼此间的协调。 角色介绍Subject(发布者):负责管理观察者的注册和注销,并在状态改变时通知所...

Observer 模式(也称为发布-订阅模式)是一种设计模式,用于实现对象之间的松耦合通信。在这种模式下,一个对象(称为SubjectPublisher)维护一组依赖它的对象(称为ObserversSubscribers),并在状态发生变化时通知它们。这使得系统中的组件能够独立变化,同时保持彼此间的协调。

角色介绍

  1. Subject(发布者):负责管理观察者的注册和注销,并在状态改变时通知所有已注册的观察者。
  2. Observer(观察者):定义一个更新接口,以便当 Subject 发生变化时接收通知。
  3. ConcreteSubject(具体发布者):维护状态,并在状态改变时通知所有已注册的观察者。
  4. ConcreteObserver(具体观察者):实现 Observer 接口,定义具体的更新逻辑。

实现步骤

  1. 定义 Observer 接口:定义一个更新方法,所有观察者都需要实现这个方法。
  2. 定义 ConcreteObserver 类:实现 Observer 接口,并定义具体的更新逻辑。
  3. 定义 Subject 类:维护一个观察者列表,并提供方法来添加、删除观察者,以及通知观察者。
  4. 定义 ConcreteSubject 类:继承或实现 Subject 类,并在状态改变时调用通知方法。

示例代码

下面是一个简单的 JavaScript 示例,演示如何实现 Observer 模式:

// 定义 Observer 接口
class Observer {
  update(message) {
    throw new Error('Method not implemented');
  }
}

// 具体观察者
class ConcreteObserverA extends Observer {
  update(message) {
    console.log(`ConcreteObserverA received message: ${message}`);
  }
}

class ConcreteObserverB extends Observer {
  update(message) {
    console.log(`ConcreteObserverB received message: ${message}`);
  }
}

// 定义 Subject 类
class Subject {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) {
    if (!this.observers.includes(observer)) {
      this.observers.push(observer);
    }
  }

  removeObserver(observer) {
    const index = this.observers.indexOf(observer);
    if (index !== -1) {
      this.observers.splice(index, 1);
    }
  }

  notify(message) {
    for (let observer of this.observers) {
      observer.update(message);
    }
  }
}

// 具体发布者
class ConcreteSubject extends Subject {
  changeState(newMessage) {
    console.log(`ConcreteSubject state changed to: ${newMessage}`);
    this.notify(newMessage);
  }
}

// 使用示例
const subject = new ConcreteSubject();
const observerA = new ConcreteObserverA();
const observerB = new ConcreteObserverB();

subject.addObserver(observerA);
subject.addObserver(observerB);

subject.changeState('New state 1');
subject.removeObserver(observerA);
subject.changeState('New state 2');

解释

  1. Observer 接口:定义了一个 update 方法,所有观察者必须实现这个方法。
  2. ConcreteObserverA 和 ConcreteObserverB:实现了 Observer 接口,并定义了具体的更新逻辑。
  3. Subject 类:维护了一个观察者列表,并提供了添加、删除观察者的方法,以及通知所有观察者的方法。
  4. ConcreteSubject 类:继承了 Subject 类,并在状态改变时调用 notify 方法。

结论

Observer 模式提供了一种灵活的方式来实现对象之间的松耦合通信。通过定义明确的接口和分离关注点,可以使系统更加模块化和易于扩展。这种模式在很多实际应用场景中都非常有用,例如事件驱动的系统、实时数据更新系统等。理解并正确应用 Observer 模式可以帮助开发者构建更健壮和可维护的软件系统。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。