23种设计模式之6.适配器模式

513 阅读2分钟

适配器模式是将一个接口转变为另一个接口,达到对一些接口的兼容。概念比较抽象,举个例子:电脑上有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();
    }
}

运行结果如下图:

image.png

可以看到只需要通过run方法就可以让car和dog都跑起来,car的的适配就成功了。

适配器模式优点:

  1. 屏蔽一些底层的不同,调用者使用简单、直接,不必关心底层调用关系。
  2. 通过引入适配器类,不用修改待适配者的代码,能够统一接口调用。
  3. 增加了代码的复用

适配器模式缺点:

  1. 使用适配器模式,表示原来的架构本来就有缺点,通常有相似的功能但是接口不一样才做适配器适配,那就说明原来不同的接口还能抽象出更基础的接口。所以适配器就是一种缺陷补救的措施。
  2. 适配器模式会增加调用栈的深度,会增加系统复杂性。从外面看调用了A接口,结果里面又适配成调用B接口,使得调用更复杂。