Skip to main content
 首页 » 编程设计

Java适配器模式

2022年07月19日141grandyang

介绍 Java 适配器模式

本文我们探讨下Java实现适配器模式。

适配器模式两个不兼容接口的连接器,因为两者不能直接连接。适配器使用新的接口包装已经存在的类,这样使其与客户端接口兼容。
使用该模式的目的是转换已经存在接口至另一个客户端期望的接口。通常在应用程序被设计好之后实现。

示例说明

假设一个场景,一个应用在美国开发,其返回豪华汽车最高速度每小时多少英里。现在英国需要使用同样的应用,但其速度需要返回每小时多少公里。为了解决该问题,我们创建一个适配器负责转换速度为我们期望的结果。

uml img

首先,我们创建原接口Movable,其支持按照每小时多少英里的速度返回豪华汽车的速度:

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

现在我们创建该接口一个具体实现:

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

现在我们创建一个适配器MovableAdapter,与原Movable类类似,但需要稍微修改下,获得我们需要的速度表示方式:

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

该接口实现包括一个私有方法,其负责速度转换:

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); 
} 

我们看到,适配器实现了该场景的转换:从268mph 至 431 km/h。

适配器应用场景

  • 当外部组件提供了我们希望重用的功能,但其与我们的应用不兼容。这时定义合适的适配器使其彼此兼容。

  • 当我们的应用于客户端希望的接口不兼容时。

  • 当我们的应用想重用遗留的代码,但有不想修改原来的代码。

总结

本文我们通过示例探讨了适配器模式。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/89738617
阅读延展