1. Overview
在本快速教程中,我们将介绍Adapter模式及其Java实现。
2. The Adapter Pattern
适配器模式充当两个不兼容接口之间的连接器,否则它们不能直接连接。适配器使用新的界面包装现有的类,从而使其与客户端的界面兼容。
使用此模式的主要动机是将现有接口转换为客户端期望的另一个接口。 通常在设计完应用程序后即可实施。
2.1. Adapter Pattern Example
考虑一个场景,在该场景中,有一个在美国开发的应用程序以每小时英里数(MPH)的速度返回豪华车的最高速度。 现在,我们需要为英国的客户使用相同的应用程序,希望获得相同的结果,但以每小时公里数(km / h)为单位。
为了解决这个问题,我们将创建一个适配器,该适配器将转换值并提供所需的结果:
首先,我们将创建原始接口Movable,该接口应以每小时英里的速度返回某些豪华车的速度:
public interface Movable {
// returns speed in MPH
double getSpeed();
}
现在,我们将创建此接口的一个具体实现:
public class BugattiVeyron implements Movable {
@Override
public double getSpeed() {
return 268;
}
}
现在,我们将基于该接口创建一个适配器接口活动Adapter活动类。 可以对其稍加修改,以在不同情况下产生不同的结果:
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. When to Use Adapter Pattern
- 当外部组件提供了我们想要重用的引人入胜的功能时,但它与我们当前的应用程序不兼容。 可以开发合适的适配器以使其相互兼容当我们的应用程序与客户期望的接口不兼容时当我们想在您的应用程序中重用旧代码而不对原始代码进行任何修改时
3. Conclusion
在本文中,我们了解了Java中的适配器设计模式。
The full source code for this example is available over on GitHub.