js设计模式--观察者模式

概述

观察者模式用于在对象之间建立 一对多 的依赖关系,当一个对象状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。在js中,观察者模式通常由两个角色组成:主体(Subject)和观察者(Observer)。主体维护一个观察者列表,并提供添加、删除和通知观察者的方法。观察者则实现一个更新方法,用于接收主体的通知并执行相应的操作。

通过使用观察者模式,可以 实现松耦合 的代码架构,使得主体和观察者彼此独立,易于扩展和维护。在js中,观察者模式广泛应用于事件处理、异步编程和React等框架中。

使用场景

观察者模式通常用于对象间的一对多依赖关系,当一个对象的状态发生变化时,它会自动通知所有依赖它的对象,让它们进行相应的更新操作。这种模式适用于以下场景:

  1. 当一个对象的改变需要同时改变其他对象的时候。
  2. 当一个对象需要将自己的改变通知其他对象而又不希望与这些对象形成紧耦合关系的时候。
  3. 当一个对象和其他对象之间存在很多依赖关系,而这些依赖关系又是可变的时候。

代码示例

实现观察者模式,可以通过以下步骤:

  1. 创建一个被观察者(Subject)对象,它包含一个观察者(Observer)列表和一些方法来添加、删除和通知观察者。
  2. 创建一个观察者对象,它包含一个 update 方法,用于接收来自被观察者的通知。
  3. 创建一个被观察者实例和多个观察者实例,并将观察者添加到被观察者的观察者列表中。
  4. 调用被观察者的 notifyObservers 方法,通知所有观察者更新。

这样,当被观察者的状态发生改变时,就会通知所有观察者,让它们能够及时更新自己的状态。

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

  addObserver(observer) {
    this.observers.push(observer);
  }
  removeObserver(observer) {
    const index = this.observers.indexOf(observer);
    if (index !== -1) {
      this.observers.splice(index, 1);
    }
  }
  notifyObservers(data) {
    for (const observer of this.observers) {
      observer.update(data);
    }
  }
}

// 2.
class Observer {
  constructor() {}
  update(data) {
    console.log(`Received data:${data}`);
  }
}

// 3.
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();

subject.addObserver(observer1);
subject.addObserver(observer2);

// 4.
subject.notifyObservers(JSON.stringify({ message: 'Hello' }));
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式(Observer Pattern)是一种常用的设计模式,它用于对象间的一对多依赖关系的处理,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 在JavaScript中,观察者模式通常用于DOM事件监听、异步回调、数据绑定等场景。下面是一个简单的实例,使用观察者模式实现一个发布-订阅模式的事件处理器。 ```javascript // 事件处理器 class EventHandler { constructor() { this.handlers = {}; } // 订阅事件 subscribe(eventName, handler) { if (!this.handlers[eventName]) { this.handlers[eventName] = []; } this.handlers[eventName].push(handler); } // 取消订阅 unsubscribe(eventName, handler) { if (!this.handlers[eventName]) { return; } const index = this.handlers[eventName].indexOf(handler); if (index !== -1) { this.handlers[eventName].splice(index, 1); } } // 发布事件 publish(eventName, ...args) { if (!this.handlers[eventName]) { return; } this.handlers[eventName].forEach(handler => handler(...args)); } } // 使用示例 const eventHandler = new EventHandler(); // 订阅事件 eventHandler.subscribe('click', () => console.log('click event fired')); eventHandler.subscribe('change', (value) => console.log(`value changed to ${value}`)); // 发布事件 eventHandler.publish('click'); // 输出: "click event fired" eventHandler.publish('change', 10); // 输出: "value changed to 10" // 取消订阅 const handler = () => console.log('test'); eventHandler.subscribe('test', handler); eventHandler.unsubscribe('test', handler); ``` 在上面的代码中,我们创建了一个 EventHandler 类,它包含了三个方法:subscribe、unsubscribe 和 publish。它们分别用于订阅事件、取消订阅事件和发布事件。在使用时,我们可以通过调用 subscribe 方法来订阅事件,通过 publish 方法来发布事件,通过 unsubscribe 方法来取消订阅事件。当发布一个事件时,所有订阅该事件的处理器都会被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值