Contents

Java 中的适配器设计模式

1. 概述

在本快速教程中,我们将了解适配器模式及其 Java 实现。

2. 适配器模式

**适配器模式充当两个不兼容的接口之间的连接器,否则无法直接连接。**适配器使用新接口包装现有类,使其与客户端接口兼容。 使用此模式的主要动机是将现有接口转换为客户期望的另一个接口。它通常在设计应用程序后实施。

2.1. 适配器模式示例

假设有一个在美国开发的应用程序,它以英里/小时 (MPH) 为单位返回豪华车的最高速度。现在我们需要为我们在英国的客户使用相同的应用程序,该应用程序需要相同的结果,但以公里/小时 (km/h) 为单位。

为了解决这个问题,我们将创建一个适配器来转换值并为我们提供所需的结果:

/uploads/java_adapter_pattern/1.jpg

首先,我们将创建原始界面Movable,它应该以英里/小时返回一些豪华汽车的速度:

public interface Movable {
    // returns speed in MPH 
    double getSpeed();
}

我们现在将创建此接口的一个具体实现:

public class BugattiVeyron implements Movable {
 
    @Override
    public double getSpeed() {
        return 268;
    }
}

现在我们将创建一个基于相同Movable类的适配器接口MovableAdapter。它可能会稍作修改,以在不同的场景下产生不同的结果:

public interface MovableAdapter {
    // returns speed in KM/H 
    double getSpeed();
}

此接口的实现将包含用于转换的私有方法convertMPHtoKMPH()

public class MovableAdapterImpl implements MovableAdapter {
    private Movable luxuryCars;
    
    // standard constructors
    @Override
    public double getSpeed() {
        return convertMPHtoKMPH(luxuryCars.getSpeed());
    }
    
    private double convertMPHtoKMPH(double mph) {
        return mph * 1.60934;
    }
}

现在我们将只使用适配器中定义的方法,我们将获得转换后的速度。在这种情况下,以下断言将成立:

@Test
public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() {
    Movable bugattiVeyron = new BugattiVeyron();
    MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);
 
    assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
}

正如我们在这里可以注意到的,对于这种特殊情况,我们的适配器将268 mph转换为431 km/h

2.2. 何时使用适配器模式

  • 当外部组件提供了我们想要重用的迷人功能,但它与我们当前的应用程序不兼容时。可以开发合适的Adapter,让它们相互兼容
  • 当我们的应用程序与客户期望的接口不兼容时
  • 当我们想在我们的应用程序中重用遗留代码而不对原始代码进行任何修改时