定义
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
从定义可知,适配器模式的作用就是适配两个互不匹配的接口,从而使类与类之间能相互交流。
该模式解决的问题: 1、现有的类的接口不符合系统的需要,需要进行改造。 2、需要一个可重用的类来用于一些和它没有太大关联的类,其不一定有一致的接口。
UML图
从UML图中可知,适配器模式由3部分组成:
1. Target目标角色 :该角色定义把其他类转换为何种接口,也就是我们期望的适配接口。
2. Adaptee源角色 :即要被适配器包装的角色,该角色原来的接口无法与目标角色沟通。
3. Adapter适配器角色 :适配器角色将源角色转换为目标角色,通过继承或关联的方式。
通过代码来看一下适配器模式的思想。
假如你天马行空,想让一辆汽车既能在公路上行驶,又能像飞机一样在天上飞行,但是汽车的接口和飞机的接口并不兼容,于是你搞了个适配器,使得汽车可以适配飞机的飞行功能。
1.创建飞机接口
public interface Plane{
void fly();
}
2.创建汽车接口
public interface Car{
void drive();
}
3.创建汽车接口的实现类
public class BYD implements Car{
@Override
public void drive() {
System.out.println("BYD drive");
}
}
4.创建适配器
public class CarAdapter implements Plane {
private Car car;
public TurkeyAdapter(Car car) {
this.car = car;
}
@Override
public void fly() {
car.drive();
}
}
5.测试
public class Test{
public static void main(String[] args) {
Car car = new BYD();
Plane plane = new CarAdapter(car);
plane.fly();
}
}
上述代码的关键就是适配器继承或依赖已有的对象,实现想要的目标接口。
总结:
1.优点:
1、可以让两个关联不大的类相兼容。 2、提高了类的复用性。
缺点:
1、过多地使用适配器不是一个好选择,系统会非常零乱。
2、一个类只能适配一个适配者类,而且目标类必须是抽象类。
详细设计阶段不要考虑使用适配器模式,使用主要场景为扩展应用中。其使用场景为在一个系统中加入额外的类,使类与系统相兼容;修改接口时。