观察者模式 · 语雀

阅读时长 4 分钟读完

观察者模式是一种常见的设计模式,它用于在对象间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在前端开发中,观察者模式常被用来实现组件之间的通信,特别是在事件驱动的场景下,如用户点击、滚动等。

基本概念

在观察者模式中,有两个主要角色:

  • Subject(主题):被观察的对象,它维护了一个观察者列表,可以添加、删除和通知观察者。
  • Observer(观察者):观察主题对象的行为,当主题对象的状态发生改变时,观察者会收到通知并执行相应的操作。

实现方式

在 JavaScript 中,可以通过以下两种方式实现观察者模式:

1. 手动实现

手动实现观察者模式需要定义 Subject 和 Observer 两个类,并在 Subject 中提供注册、删除和通知观察者的方法,代码示例如下:

-- -------------------- ---- -------
----- ------- -
  ------------- -
    -------------- - ---
  -

  --------------------- -
    ------------------------------
  -

  ------------------------ -
    ----- ----- - ---------------------------------
    -- ------ --- --- -
      ---------------------------- ---
    -
  -

  ------------ -
    --------------------------------- -- -----------------------
  -
-

----- -------- -
  ------------ -
    --------------------- ----- ----------
  -
-

在上面的示例中,Subject 类维护了一个 observers 数组,可以通过 addObserver 方法向其中添加观察者,removeObserver 方法删除观察者,notify 方法通知所有观察者。Observer 类定义了 update 方法,用于接收主题对象传递的数据。

2. 使用第三方库

除了手动实现外,还可以使用一些现成的第三方库来简化观察者模式的使用,如 PubSubJS、RxJS 等。这里以 PubSubJS 为例,代码示例如下:

-- -------------------- ---- -------
------ ------ ---- ------------

----- ----- - --------------------------- ------- ----- -- -
  --------------------- ----- ----------
---

------------------------- ------ --------

--------------------------

在上面的示例中,可以通过 pubsub.subscribe 方法订阅一个主题,并指定回调函数,当该主题被发布时就会执行相应的操作。pubsub.publish 方法用于发布一个主题,并传递相应的数据。pubsub.unsubscribe 方法用于取消订阅。

应用场景

观察者模式在前端开发中有广泛的应用,特别是在以下场景下:

  • 组件之间的通信:将一个组件的状态作为主题对象,其他组件作为观察者,通过订阅和发布主题对象来实现组件之间的通信。
  • 事件驱动的场景:如用户点击、滚动等,可以将事件作为主题对象,其他模块作为观察者,通过订阅和发布来响应相应的事件。

实际案例

以下是一个使用观察者模式实现组件之间通信的示例代码:

-- -------------------- ---- -------
----- ------- -
  ------------- -
    -------------- - ---
  -

  --------------------- -
    ------------------------------
  -

  ------------------------ -
    ----- ----- - ---------------------------------
    -- ------ --- --- -
      ---------------------------- ---
    -
  -

  ------------ -
    --------------------------------- -- -----------------------
  -
-

----- ------------- ------- -------

- ----------------------------------------------------------- --------
----------------------------------------------------------------------------------
纠错
反馈