换一种方式理解观察者模式

用 TypeScript 解析观察者模式

在前端开发中,观察者模式是一种常见的设计模式。它定义了一种对象之间的一对多依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象状态发生改变时,所有观察者对象都会得到通知并自动更新。

虽然这个模式看起来简单,但是理解和实现它可能会有一定的挑战。在本文中,我们将通过 TypeScript 示例代码和深入探讨来更好地理解和应用观察者模式。

观察者模式基础

观察者模式由两个主要角色组成:Subject(主题)和 Observer(观察者)。他们之间的关系如下图所示:

  • Subject(主题):主题是被观察的对象,当它的状态发生改变时,会通知所有注册的观察者,并调用它们的更新方法。在 TypeScript 中,可以使用抽象类或接口来表示主题。
  • Observer(观察者):观察者是需要被通知的对象,它们注册到主题中以接收通知并响应状态更改。在 TypeScript 中,可以使用接口或类来表示观察者。

TypeScript 实现观察者模式

让我们看一下如何使用 TypeScript 来实现观察者模式。

首先,我们需要定义 Subject 接口和 Observer 接口:

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

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

接下来,我们将通过创建一个具体的主题类 WeatherStation 和两个具体的观察者类 TemperatureDisplayHumidityDisplay 来演示如何使用观察者模式。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们创建了一个主题类 WeatherStation,它有一个温度属性和一个湿度属性。我们还定义了两个观察者类 TemperatureDisplayHumidityDisplay,它们会从 WeatherStation 中获取温度和湿度并显示出来。

WeatherStation 的温度或湿度发生变化时,它会调用 notifyObservers() 方法来通知所有注册的观察者并调用它们的 update() 方法

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/5151