我们何时需要适配器模式?

bra*_*ess 23 design-patterns adapter

我们什么时候需要去适配器模式?如果可能的话,给我一个适合这种模式的真实世界的例子......

mik*_*nne 44

我在一个需要与外部DVR接口的系统上工作.在大多数情况下,所有DVR都具有相同的基本功能:从某个视频源开始录制; 停止录音; 从某个时间开始播放; 停止播放等

每个DVR制造商都提供了一个软件库,允许我们编写代码来控制他们的设备(为了便于讨论,我将其称为SDK).即使每个SDK都提供了所有基本功能的API,但它们都不是完全相同的.这是一个非常粗略的例子,但你明白了:

  • BeginPlayback(DateTime startTime);
  • StartPlayback(long startTimeTicks);
  • 播放(字符串startDate,字符串startTime);

我们的软件需要能够与所有DVR进行交互.因此,我们不是为每个不同的SDK编写可怕的开关/案例,而是创建了我们自己的公共IDVRController接口,并将所有系统代码写入该接口:

  • 播放(DateTime startTime);

然后,我们为每个SDK编写了一个不同的适配器实现,所有这些实现都实现了我们的IDVRController接口.我们使用配置文件来指定系统将连接到的DVR的类型,并使用Factory模式来实例化该DVR的IDVRController的正确实现者.

这样,适配器模式使我们的系统代码更简单:我们总是编码为IDVRController.它允许我们在部署后为新的SDK推出适配器(我们的工厂使用反射来实例化正确的IDVRController实例).

  • 优秀的现实生活例子。它帮助我理解了这种模式的真正目的。我已经看到这种模式主要与服务定位器或工厂模式一起使用。 (2认同)

bha*_*ran 14

现有接口

interface Shape {
    public int calculateArea(int r);
}
Run Code Online (Sandbox Code Playgroud)

Shape 接口的当前实现

class Square implements Shape {
    @Override
    public int calculateArea(int r) {
        return r * r;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在考虑您希望 Circle 类适应我们现有的界面,我们无法修改(由第三方编写)。

class Circle {
    public double calculateCircularArea (int r) {
        return 3.14 * r * r;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们已经使 Circle 实现适应我们的 Shape 接口。所以我们需要一个适配器,因为它们不兼容。

class CirCleAdaptor extends Circle implements Shape {
    @Override
    public int calculateArea(int r) {
        return (int) calculateCircularArea(r);
    }
}
Run Code Online (Sandbox Code Playgroud)

CircleAdaptor - 是 Circle
Circle的适配器 - 是 Adaptee
形状 - 是目标接口

public class AdapterPattern {
    public static void main(String[] args) {
        Shape circle = new CirCleAdaptor();
        System.out.println("Circle Area " + circle.calculateArea(5));
        Shape square = new Square();
        System.out.println("Square Area " + square.calculateArea(5));
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这能更好地了解何时使用它。


Jos*_*iaz 6

在计算机编程中,适配器模式(通常称为包装器模式或简称为包装器)是一种将类的一个接口转换为兼容接口的设计模式。适配器通过在使用原始接口的同时向客户端提供其接口,允许通常由于接口不兼容而无法一起工作的类一起工作。适配器会将对其接口的调用转换为对原始接口的调用,并且执行此操作所需的代码量通常很小。适配器还负责将数据转换为适当的形式。例如,如果多个布尔值存储为单个整数,但您的消费者需要“true”/“false”,则适配器将负责从整数值中提取适当的值。

替代文本

维基百科!!!


Jaa*_*bax 6

当您必须处理具有相似行为的不同接口(这通常意味着具有相似行为但具有不同方法的类)时,可以使用适配器设计模式。例如,一个类连接到三星电视,另一个类连接到索尼电视。它们将共享常见的行为,例如打开菜单、开始播放、连接到网络等,但每个库都会有不同的实现(具有不同的方法名称和签名)。这些不同供应商特定的实现在 UML 图中称为“Adaptee” 。

因此,在您的代码(在 UML 图中称为Client )中,您可以创建一个通用接口(在 UML 图中称为Target )来包装这些类似的行为并工作,而不是对每个供应商(或Adaptee )的方法调用进行硬编码。仅使用一种类型的对象。

然后,适配器将实现目标接口,将其方法调用委托给通过构造函数传递给适配器的适配器

为了让您在 Java 代码中实现这一点,我使用与上面提到的完全相同的示例编写了一个非常简单的项目,使用适配器来处理多个智能电视接口。该代码很小,文档齐全且不言自明,因此请深入研究它以了解现实世界的实现是什么样子。

只需下载代码并将其作为 Maven 项目导入 Eclipse(或您最喜欢的 IDE)即可。您可以通过运行org.example.Main.java来执行代码。请记住,这里重要的是了解如何将类和接口组装在一起来设计模式。我还在com.thirdparty.libs包中创建了一些假的适应者。希望能帮助到你!

https://github.com/Dannemann/java-design-patterns