设计模式——适配器模式

254 阅读2分钟

引言

网上有很多介绍设计模式系列的优秀文章,看懂不一定是真懂,能写出来,说出个1、2、3点才算是真的懂了,如果能灵活的应用到工作中才算是真的熟练。

1、模式场景

手机充电器的数据线一端是typec类型连接手机,另一端是usb类型可以连接电脑,现在我们加个usb适配器,使得数据线可以通过220V插座进行充电。

2、模式结构

在这里插入图片描述

  • 目标抽象类 Target(对应模拟场景中的充电器)
  • 适配器类 Adapter(对应模拟场景中usb适配器)
  • 适配者类 Adaptee(对应模拟场景中usb数据线)
  • 客户类 Client(对应模拟场景中手机充电行为)

3、示例代码

适配器模式有对象适配器和类适配器两种实现,本示例采用的是对象适配器方式。

3.1、目标抽象类

public abstract class Target {
    public void charging(){
        System.out.println("插座充电");
    }
}

3.2、适配器类

//Usb适配器
public class UsbAdapter extends Target {

    private Usb usb;

    public UsbAdapter(Usb usb){
        this.usb = usb;
    }
    @Override
    public void charging() {
        usb.usbCharging();
    }
}

3.3、适配者类

public class Usb {
    public void usbCharging(){
        System.out.println("usb charging ...");
    }
}

3.4、客户端

public class Client {
    public static void main(String[] args) {
        Target usbAdapter = new UsbAdapter(new Usb());
        usbAdapter.charging();
    }
}

控制台输出:

usb charging ...

4、模式优点

  • 将目标类和适配者类解耦,增加一个适配器类,无需修改原代码逻辑。
  • 增加了类的灵活性、复用性、扩展性。

5、模式缺点

  • 类适配器模式的缺点是:目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,且Java是单继承,所以一次最多只能适配一个适配者类。
  • 对象适配器模式的缺点:要想置换适配者类的方法不容易,需要重写适配者类子类方法,再把适配者类的子类当做真正的适配者进行适配,实现过程复杂。

结束语

JDK的IO中InputStreamReader就是适配器模式,目标抽象类Reader,适配者类InputStream,感兴趣的可以去看看。下一篇:设计模式——桥接模式