面试高频手撕题 | 18.实现一个观察者模式

alt

一、知识点

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

在观察者模式中,有以下几个角色:

  1. 主题(Subject):被观察的对象,它拥有状态并可以修改状态。
  2. 观察者(Observer):观察主题的对象,当主题的状态发生改变时,观察者会收到通知。
  3. 具体主题(ConcreteSubject):具体的被观察对象,它实现了主题的接口,持有观察者列表,并在状态改变时通知观察者。
  4. 具体观察者(ConcreteObserver):具体的观察对象,它实现了观察者的接口,接收主题的通知并进行相应的处理。

alt

二、思路分析

实现观察者模式的关键是解耦主题和观察者,让它们能够独立变化。以下是一些基本的思路:

  1. 主题持有观察者列表,当状态改变时遍历通知观察者。
  2. 观察者通过注册或订阅方式向主题登记,以便接收通知。
  3. 主题和观察者之间定义一个接口,用于通知状态变化。

三、JavaScript 解答

以下是使用 JavaScript 实现观察者模式的一个简单示例:

class Subject {
  constructor() {
    this.observers = [];
  }

  attachObserver(observer) {
    this.observers.push(observer);
  }

  detachObserver(observer) {
    this.observers = this.observers.filter(item => item !== observer);
  }

  notifyObservers() {
    this.observers.forEach(observer => observer.update());
  }
}

class Observer {
  constructor(name) {
    this.name = name;
  }

  update() {
    console.log(`${this.name} 收到通知`);
  }
}

// 创建主题对象
const subject = new Subject();

// 创建观察者对象
const observer1 = new Observer('Observer 1');
const observer2 = new Observer('Observer 2');

// 观察者注册到主题
subject.attachObserver(observer1);
subject.attachObserver(observer2);

// 主题发出通知
subject.notifyObservers();

// 观察者取消注册
subject.detachObserver(observer1);

// 主题再次发出通知
subject.notifyObservers();

在上述示例中,我们创建了一个Subject类和一个Observer类。Subject类负责管理观察者,并提供了attachObserverdetachObservernotifyObservers方法。Obs类是具体的观察者,它实现了方法用于接收通知。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024前端面试高频手撕题 文章被收录于专栏

2024前端面试高频手撕题的作用包括但不限于提升面试竞争力、检验基础知识掌握程度、提高问题解决能力等。本专栏从知识点,思路分析,JavaScript解答,Java解答,总结等五个方面全方面解答。适用于:准备前端开发岗位面试的求职者、希望提升前端开发技能和知识的学习者、准备升职或跳槽的前端开发人员。掌握面试高频手撕题都是非常有益的,它能够帮助你建立起扎实的前端基础知识和问题解决能力。

全部评论
通过实现观察者模式,我们解耦了主题和观察者,使它们能够独立变化。主题可以通知多个观察者,而观察者可以根据需要进行相应的处理。这种模式在许多场景中都非常有用,如事件监听、数据变化通知等。
点赞 回复 分享
发布于 2024-01-15 23:56 北京
厉害了
点赞 回复 分享
发布于 2024-01-14 18:16 广东

相关推荐

06-19 12:33
安徽大学 Java
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q了:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务