📜  道具反应 - Javascript (1)

📅  最后修改于: 2023-12-03 15:12:27.183000             🧑  作者: Mango

道具反应 - JavaScript

道具反应是编程中常见的设计模式之一,也称为“观察者模式”或“发布-订阅模式”。道具反应建立在事件通知的基础上,当一个对象发生状态改变时,所有订阅这个对象的观察者都会接收到通知并更新自己的状态或行为。

原理

道具反应的核心原理就是事件的监听和触发。在 JavaScript 中,我们可以通过监听对象的属性值的改变来触发事件,然后通过事件通知,通知所有的观察者进行相应的操作。

基本的流程如下:

  1. 定义一个目标对象(Subject),并在其内部定义一些属性和方法;
  2. 在目标对象中定义一个通知方法(notify),当目标对象的属性发生变化时,会调用该方法;
  3. 定义一个观察者对象(Observer),包含一个处理方法(handle),当接受到目标对象的通知时,会调用该方法来更新自己的状态或行为;
  4. 在观察者对象中实现事件的注册方法(subscribe)和注销方法(unsubscribe),用于将观察者对象注册到目标对象的观察者列表中和从观察者列表中删除该观察者对象;
  5. 目标对象在发生改变时,调用通知方法(notify),通知所有在观察者列表中注册的观察者对象。
示例代码
class Subject {
  constructor() {
    this.observers = [];
    this.property = '';
  }

  setProperty(value) {
    this.property = value;
    this.notify();
  }

  getProperty() {
    return this.property;
  }

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

  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => observer !== obs);
  }

  notify() {
    this.observers.forEach(observer => observer.handle(this));
  }
}

class Observer {
  handle(subject) {
    console.log(`${subject.getProperty()} has been updated.`);
  }
}

const subject = new Subject();
const observer = new Observer();

subject.subscribe(observer);

subject.setProperty('new value'); // logs 'new value has been updated.'

以上代码定义了一个 Subject 类和 Observer 类,Subject 类中包含了 setProperty()、getProperty()、subscribe()、unsubscribe()、notify() 方法,其中 notify() 方法会调用 Observer 类中的 handle() 方法内容。在 main 函数中,我们实例化了一个 Subject 对象和一个 Observer 对象,并将 Observer 对象注册到 Subject 对象中。

使用 setProperty() 方法来更新 Subject 对象的 property 值,在 property 值发生变化时,会触发 Subject 对象的 notify() 方法,从而调用 Observer 对象的 handle() 方法。

总结

道具反应模式建立了一种对象之间解耦的联系方式,目标对象与观察者对象完全独立,彼此之间没有任何依赖关系。通过这种方式,我们可以让应用程序更加灵活、可维护和可扩展。