设计模式之适配器模式

适配器模式的作用

适配器模式使得原来由于接口不兼容而不能一起工作的哪些类可以在一起工作。

适配器中的角色:

  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换为目标接口
  • 待适配对象(Adaptee):需要适配的类或适配者类

快速理解运用

举例:使用电脑查看手机中的数据

  • 目标接口:电脑上的USB接口
  • 适配器:手机电脑连接线
  • 待适配对象:手机

类关系图如下
适配器模式

适配器实现一:适配器持有待适配类的引用

待适配的对象

public class Phone {
    public void use() {
        System.out.println("访问手机中的数据");
    }
}

适配器

public class PhoneCable implements USBInterface{
    private Phone phone;
    
    public PhoneCable(Phone phone) {
        super();
        this.phone = phone;
    }

    @Override
    public void use() {
        phone.use();
    }
}

目标接口

public interface USBInterface {
    void use();
}

客户端使用

public class Computer {
    public static void main(String[] args) {
        Phone phone = new Phone();
        USBInterface target = new PhoneCable(phone);
        target.use();
    }
}

适配器的实现方式二:适配器继承待适配类

此时,只需将适配器实现如下

public class PhoneCable extends Phone implements USBInterface{
    @Override
    public void use() {
        super.use();
    }
}

客户端使用

public class Computer {
    public static void main(String[] args) {
        USBInterface target = new PhoneCable();
        target.use();
    }
}

一般不建议使用继承方式,因为继承方式扩展性不佳。扩展性不佳是因为Java中不存在多继承,所以一个适配器中只能继承一个待适配的类,如果要扩展适配器的功能时,则建议使用第一种方式。

适配器在Java中的应用:
InputStreamReader(InputStream)
OutputStreamWriter(OutputStream)