发布于 2026-01-06 8 阅读
0

设计模式 - 适配器模式:何时使用适配器模式 — 示例 1:一台新的 Android 设备抵达城市(使用 JavaScript/TypeScript 适配器模式) — 示例 2:几个种族想要合作(元气弹) 结论 更多更多更多…… 由 Mux 呈现的 DEV 全球展示挑战赛:展示你的项目!

设计模式 - 适配器

适配器模式:何时使用

适配器模式 — 示例 1:使用 JavaScript/TypeScript 演示新 Android 设备抵达城市的示例

适配器模式 — 示例 2:多个种族想要合作(元气弹)

结论

更多更多更多……

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

原著中描述了23种经典设计模式
Design Patterns: Elements of Reusable Object-Oriented Software。这些模式
为软件
开发中经常重复出现的特定问题提供了解决方案。

在本文中,我将介绍适配器模式的原理,以及如何
以及何时应用它。

适配器模式:基本概念

适配器允许两个不兼容的接口协同工作。这是适配器在现实世界中的定义。接口可能不兼容,但其内部功能应该满足需求。适配器设计模式通过将一个类的接口转换为客户端期望的接口,使原本不兼容的类能够协同工作。——维基百科

将一个类的接口转换为客户端期望的另一个接口。适配器使原本由于接口不兼容而无法协同工作的类能够协同工作。——《设计模式:可复用面向对象软件的基础》

这种模式的主要特点是重用与其他类接口不同的类,或者重用几个接口不同的类,以便它们能够协同工作。

这种图案有两种版本:

  • 它通过在运行时委托给一个对象object adapter来实现接口。targetadaptee
  • 通过在编译时继承一个类来class adapter实现接口。targetadaptee

由于包括 Java 在内的许多语言不支持多重继承,并且多重继承
会带来很多问题,因此我们没有展示使用类适配器模式的实现。

总而言之,对象适配器(又称适配器)包含它所
包装的类的一个实例。该模式的 UML 图如下所示:

该类Adaptor包含Adaptee该类。这意味着Adaptee该类将被其他类使用Adaptor

适配器模式:何时使用

  1. 有一个类,它的接口与你需要的接口不匹配。
  2. 虽然有多个子类,但通过对每个子类都进行子类化来调整它们的接口是不切实际的。

适配器模式具有以下几个优点:

  • 代码更具可重用性和灵活性
  • 代码简洁,因为客户端/上下文在每个具体类中不使用不同的接口,并且可以使用多态性在不同的适配器之间切换。

适配器模式 — 示例 1:使用 JavaScript/TypeScript 演示新 Android 设备抵达城市的示例

现在我将向您展示如何使用 JavaScript/TypeScript 实现这种模式。请注意,JavaScript 既不支持接口也不支持抽象类。因此,理解这种模式的最佳方法是使用示例和 TypeScript。在本例中,我创建了一个问题,其中有一个名为 `Warrior` 的抽象类,Warrior它定义了一个战士角色。战士角色拥有一组与问题无关的属性以及一个名为 `Warrior.get()` 的方法attack。战士角色有多种类型,例如 `Warrior.types` 和 `Warrior.types`,它们定义了 `Warrior.get()` 方法的具体实现。但是,系统中出现了一个名为 `Warrior.types` 的SaiyanNamekianattackAndroid它不满足 `Warrior` 的接口,但内部以不同的方式实现了 `Warrior.get()` 方法。下面的 UML 图展示了我刚才描述的场景。

解决方案是使用适配器模式,该模式包含一个类(AndroidAdapter),其中包含Android对象,并使用它来实现与 Warrior 接口兼容的操作。例如,使用适配器模式的新 UML 图如下所示:

与模型和接口相关的代码如下:

如您所见,该类Android尚未实现战士接口。
因此,该类AndroidAdapter需要负责解决这个问题。

最后,想要使用这三个类的客户端/上下文应该将这些类以下代码中所示的AndroidAdapter类一起使用:SaiyanNamekian

适配器模式 — 示例 2:多个种族想要合作(元气弹)

使用 JavaScript/TypeScript

适配器模式可以解决的另一个有趣问题是,当存在多个具有不同接口但可以协同工作的类时。以下 UML 图展示了这种情况:

在这种情况下,不同种族之间使用不同的接口进行交流。具体来说,每个种族都有一种或多种共享力量的方法。例如,人类有[此处应填写具体方法名称],那sharedPower美克星人有[此处应填写具体方法名称],而赛亚getPower人则更为复杂,他们有两种共享力量的方法( [此处应填写具体方法名称]myPowerPart1和[此处应填写具体方法名称myPowerPart2])。

要实现多个种族共同工作,可以使用适配器模式,如下面的 UML 图所示。

每个类都使用一个新的适配器类,该适配器类包含原始对象和实现接口的方法。此示例的代码非常简单。

它们各自的适配器如下:

最后,所有物体都贡献能量来对抗邪恶并获得强大的力量。

我创建了两个 npm 脚本,应用适配器模式后,它们会运行这里显示的两个示例。

npm run example1
npm run example2

结论

当项目中存在可以协同工作但接口不兼容的类时,适配器模式可以避免代码重复。本文将通过一个简单的 JavaScript/TypeScript 实现示例来展示适配器模式的应用。

最重要的不是像我演示的那样实现这个模式,而是能够识别出这个特定模式可以解决的问题,以及何时应该或不应该使用它。这一点至关重要,因为具体的实现方式会因你使用的编程语言而异。

更多更多更多……



原文发表于www.carloscaballero.io

文章来源:https://dev.to/carlillo/design-patterns---adapter-2pi3