适配器模式是将一个接口转变为另一个接口,达到对一些接口的兼容。概念比较抽象,举个例子:电脑上有usb口,但是你想要传输数据给内存卡,这时就需要一个读卡器,此时的读卡器扮演的就是适配器的角色,将usb接口转为内存卡接口,达到对内存卡的兼容。在程序设计中也会碰到接口不兼容的问题,就需要类似读卡器的东西来做接口的适配。
下面就用代码来实现一下适配器模式:
现在有一个接口,他有一个run方法,Dog类实现了该接口,就可以通过run方法跑起来。
public interface Target {
void run();
}
public class Dog implements Target {
@Override
public void run() {
System.out.println("The dog is running");
}
}
现在有一个小汽车,小汽车跑起来只能通过drive方法。
public class Car {
public void drive(){
System.out.println("The car was driven");
}
}
我们只想用run方法就让所有东西都能够跑起来,此时就需要对Car做适配。
适配器模式有两种。
第一种是类适配通过继承实现:
public class AdapterByClass extends Car implements Target{
@Override
public void run() {
super.drive();
}
}
第二种是对象适配通过对象组合实现:
public class AdapterByObject implements Target{
private Car car;
public AdapterByObject(Car car) {
this.car = car;
}
@Override
public void run() {
car.drive();
}
}
使用者使用:
public class Main {
public static void main(String[] args) {
Target target1 = new Dog();
target1.run();
Target target2 = new AdapterByClass();
target2.run();
Target target3 = new AdapterByObject(new Car());
target3.run();
}
}
运行结果如下图:
可以看到只需要通过run方法就可以让car和dog都跑起来,car的的适配就成功了。
适配器模式优点:
- 屏蔽一些底层的不同,调用者使用简单、直接,不必关心底层调用关系。
- 通过引入适配器类,不用修改待适配者的代码,能够统一接口调用。
- 增加了代码的复用
适配器模式缺点:
- 使用适配器模式,表示原来的架构本来就有缺点,通常有相似的功能但是接口不一样才做适配器适配,那就说明原来不同的接口还能抽象出更基础的接口。所以适配器就是一种缺陷补救的措施。
- 适配器模式会增加调用栈的深度,会增加系统复杂性。从外面看调用了A接口,结果里面又适配成调用B接口,使得调用更复杂。