适配器模式(Adapter Pattern)

定义

适配器模式是一种​​结构型设计模式​​,用于解决两个不兼容接口之间的兼容性问题。它通过​​包装对象​​的方式,将已有接口转换为客户端期望的接口,类似电源适配器的功能。


UML 类图​

设计模式之结构型:适配器模式_设计模式

核心角色

  • Target:目标接口,定义客户端期望的接口(如 request())。
  • Adaptee:被适配者,包含需要被适配的已有功能(如 specificRequest())。
  • Adapter:适配器,将 Adaptee 的接口转换为 Target 接口。
  • Client:客户端,通过 Target 接口调用功能,无需感知适配过程。

优点​

  • 兼容性​​:解决新旧接口不兼容问题,保护已有代码。
  • ​​解耦性​​:客户端与具体实现解耦,仅依赖目标接口。
  • ​​复用性​​:复用已有类或第三方库的功能,无需修改其源码。
  • ​​灵活性​​:支持同时适配多个对象或接口(如组合多个适配器)。

缺点​​

  • ​​过度包装​​:过多使用适配器会增大系统复杂度,降低可读性。
  • ​​性能损耗​​:多层适配器调用可能增加额外开销。
  • ​​设计妥协​​:可能掩盖接口设计不合理的问题(应优先优化接口设计)。

适用场景​

​​旧系统整合​​

  • 将遗留代码的接口适配到新系统(如老版支付接口适配到新平台)。
  • 第三方库的功能适配(如不同地图 SDK 的坐标转换)。

​​接口标准化​​

  • 统一多个类的接口(如不同品牌打印机的驱动适配)。
  • 微服务中不同协议转换(如 gRPC 接口适配为 RESTful API)。
    ​​## 系统扩展​​
  • 为对象添加额外功能(类似装饰器模式,但侧重接口转换)。
  • 兼容多个版本的数据格式(如 XML 转 JSON 适配器)。

​​# 代码示例(Java)​​

​​对象适配器(组合方式)​​

// 目标接口
interface Target {
    String request();
}

// 被适配者(已有功能)
class Adaptee {
    public String specificRequest() {
        return "Adaptee's method";
    }
}

// 适配器
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public String request() {
        return "Adapter: " + adaptee.specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        System.out.println(target.request());  // 输出: Adapter: Adaptee's method
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

类适配器(继承方式)​

// 目标接口
interface Target {
    String request();
}

// 被适配者
class Adaptee {
    public String specificRequest() {
        return "Adaptee's method";
    }
}

// 类适配器(通过继承实现)
class ClassAdapter extends Adaptee implements Target {
    @Override
    public String request() {
        return "Adapter: " + specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Target target = new ClassAdapter();
        System.out.println(target.request());  // 输出: Adapter: Adaptee's method
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

​​​​两种适配器对比​​

设计模式之结构型:适配器模式_设计模式_02

​​总结​​:适配器模式是解决接口不兼容问题的利器,尤其适用于整合遗留代码或第三方库,但需注意避免过度设计。优先选择​​对象适配器​​(组合方式),在单继承语言中更灵活。