设计模式 - 适配器
适配器模式:何时使用
适配器模式 — 示例 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:使用 JavaScript/TypeScript 演示新 Android 设备抵达城市的示例
现在我将向您展示如何使用 JavaScript/TypeScript 实现这种模式。请注意,JavaScript 既不支持接口也不支持抽象类。因此,理解这种模式的最佳方法是使用示例和 TypeScript。在本例中,我创建了一个问题,其中有一个名为 `Warrior` 的抽象类,Warrior它定义了一个战士角色。战士角色拥有一组与问题无关的属性以及一个名为 `Warrior.get()` 的方法attack。战士角色有多种类型,例如 `Warrior.types` 和 `Warrior.types`,它们定义了 `Warrior.get()` 方法的具体实现。但是,系统中出现了一个名为 `Warrior.types` 的Saiyan新Namekian类attack,Android它不满足 `Warrior` 的接口,但内部以不同的方式实现了 `Warrior.get()` 方法。下面的 UML 图展示了我刚才描述的场景。
解决方案是使用适配器模式,该模式包含一个类(AndroidAdapter),其中包含Android对象,并使用它来实现与 Warrior 接口兼容的操作。例如,使用适配器模式的新 UML 图如下所示:
与模型和接口相关的代码如下:
如您所见,该类Android尚未实现战士接口。
因此,该类AndroidAdapter需要负责解决这个问题。
最后,想要使用这三个类的客户端/上下文应该将这些类与以下代码中所示的AndroidAdapter类一起使用:SaiyanNamekian
适配器模式 — 示例 2:多个种族想要合作(元气弹)
使用 JavaScript/TypeScript
适配器模式可以解决的另一个有趣问题是,当存在多个具有不同接口但可以协同工作的类时。以下 UML 图展示了这种情况:
在这种情况下,不同种族之间使用不同的接口进行交流。具体来说,每个种族都有一种或多种共享力量的方法。例如,人类有[此处应填写具体方法名称],那sharedPower美克星人有[此处应填写具体方法名称],而赛亚getPower人则更为复杂,他们有两种共享力量的方法( [此处应填写具体方法名称]myPowerPart1和[此处应填写具体方法名称myPowerPart2])。
要实现多个种族共同工作,可以使用适配器模式,如下面的 UML 图所示。
每个类都使用一个新的适配器类,该适配器类包含原始对象和实现接口的方法。此示例的代码非常简单。
它们各自的适配器如下:
最后,所有物体都贡献能量来对抗邪恶并获得强大的力量。
我创建了两个 npm 脚本,应用适配器模式后,它们会运行这里显示的两个示例。
npm run example1npm run example2
结论
当项目中存在可以协同工作但接口不兼容的类时,适配器模式可以避免代码重复。本文将通过一个简单的 JavaScript/TypeScript 实现示例来展示适配器模式的应用。
最重要的不是像我演示的那样实现这个模式,而是能够识别出这个特定模式可以解决的问题,以及何时应该或不应该使用它。这一点至关重要,因为具体的实现方式会因你使用的编程语言而异。
更多更多更多……
- 设计模式:可重用面向对象软件的要素,作者:Gamma、Helm、Johnson 和 Vlissides,Addison Wesley 出版社,1995 年。
- 适配器模式 — 维基百科。
- https://www.dofactory.com/javascript/adapter-design-pattern
- https://github.com/sohamkamani/javascript-design-patterns-for-humans#-adapter
原文发表于www.carloscaballero.io。
文章来源:https://dev.to/carlillo/design-patterns---adapter-2pi3















