Skip to content

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将不兼容的接口转换为兼容的形式,使得原本由于接口不匹配而不能一起工作的类可以协同工作。适配器模式就像是一个“翻译官”,它包裹了一个对象,并提供了一个符合客户端期望的新接口。

适配器模式的主要角色

  1. Target(目标抽象类):定义了客户端使用的特定领域接口。
  2. Adaptee(被适配者):包含需要适配的现有接口。
  3. Adapter(适配器):负责将 Adaptee 的接口转换为目标(Target)接口,使得 Adaptee 能够与 Target 兼容。

在 JavaScript 中的实现

下面是一个简单的例子来说明如何在 JavaScript 中使用适配器模式:

示例:电子设备充电适配器

假设你有一个美国标准的插头(两扁),但你需要在一个只接受欧洲标准插头(三圆)的插座上充电。这里,我们可以创建一个适配器来解决这个问题。

javascript
// Target(目标抽象类)
class EuropeanSocket {
  plugIn() {
    console.log("Plugged into European socket.");
  }
}

// Adaptee(被适配者)
class AmericanPlug {
  connect() {
    console.log("Connected to American socket.");
  }
}

// Adapter(适配器)
class AmericanToEuropeanAdapter extends EuropeanSocket {
  constructor() {
    super();
    this.americanPlug = new AmericanPlug();
  }

  plugIn() {
    // 使用适配器将AmericanPlug转换为EuropeanSocket接口
    this.americanPlug.connect();
    console.log("Adapter converts American plug to fit European socket.");
  }
}

// 客户端代码
const adapter = new AmericanToEuropeanAdapter();
adapter.plugIn();
// 输出:
// Connected to American socket.
// Adapter converts American plug to fit European socket.
// Plugged into European socket.

在这个例子中:

  • EuropeanSocket 是目标接口,代表了我们想要适配到的目标接口。
  • AmericanPlug 是我们需要适配的现有接口。
  • AmericanToEuropeanAdapter 是适配器类,它继承自 EuropeanSocket 并持有一个 AmericanPlug 实例。通过覆盖 plugIn 方法,它提供了对 AmericanPlug 的间接访问,同时实现了 EuropeanSocket 接口的方法。

另一种实现方式:组合而非继承

在 JavaScript 中,除了使用继承外,还可以通过组合的方式来实现适配器模式:

javascript
// Adaptee(被适配者)
class AmericanPlug {
  connect() {
    console.log("Connected to American socket.");
  }
}

// Adapter(适配器)
class AmericanToEuropeanAdapter {
  constructor(plug) {
    this.plug = plug;
  }

  plugIn() {
    this.plug.connect();
    console.log("Adapter converts American plug to fit European socket.");
  }
}

// 客户端代码
const americanPlug = new AmericanPlug();
const adapter = new AmericanToEuropeanAdapter(americanPlug);
adapter.plugIn();
// 输出:
// Connected to American socket.
// Adapter converts American plug to fit European socket.

这种方式更加灵活,因为它避免了直接继承可能带来的复杂性,并且更符合 JavaScript 的面向对象编程实践。

应用场景

适配器模式适用于以下几种情况:

  • 当希望复用已经存在的类,但其接口不符合系统需求时。
  • 当需要统一多个不同但功能相似的类接口时。
  • 当需要集成第三方库或服务,而它们提供的 API 与现有系统不兼容时。

适配器模式提供了一种有效的方式,使得不同的接口能够在不修改原有代码的情况下协同工作,提高了代码的灵活性和可维护性。

Released under the MIT License.