设计模式-适配器模式

适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题,类似于电源插头转换器。

核心思想

适配器模式通过以下方式实现接口的兼容:

  1. 定义目标接口(Target):客户端期望使用的接口。
  2. 引入适配者类(Adaptee):需要被适配的现有类(接口不兼容)。
  3. 创建适配器类(Adapter):将适配者的接口转换为目标接口。

适配器模式分为两种实现方式:

  • 类适配器:通过继承适配者类实现目标接口(需要支持多继承,Java中不适用)。
  • 对象适配器:通过组合(持有适配者的实例)实现目标接口(更灵活,推荐使用)。

适配器模式的结构

适配器模式包含以下角色:

  • 目标接口(Target)
    • 客户端期望使用的接口。
    • 定义客户端需要的方法。
  • 适配者类(Adaptee)
    • 需要被适配的现有类(接口与目标接口不兼容)。
  • 适配器类(Adapter)
    • 实现目标接口,并持有适配者的实例。
    • 在目标接口方法中调用适配者的方法,完成接口转换。

实现示例

假设有一个欧洲标准的插座(220V),而客户端需要一个美国标准的插座(110V)。通过适配器模式实现电压转换。
(1)目标接口(Target)

java 复制代码
// 客户端期望的接口:美国标准插座(110V)
public interface USPlug {
    void supplyPower110V();
}

(2)适配者类(Adaptee)

java 复制代码
// 现有的欧洲标准插座(220V)
public class EUPlug {
    public void supplyPower220V() {
        System.out.println("提供220V电压");
    }
}

(3)适配器类(Adapter)

java 复制代码
// 适配器:将欧洲插座转换为美国标准
public class EUToUSAdapter implements USPlug {
    private EUPlug euPlug; // 持有适配者的实例

    public EUToUSAdapter(EUPlug euPlug) {
        this.euPlug = euPlug;
    }

    @Override
    public void supplyPower110V() {
        euPlug.supplyPower220V();
        System.out.println("通过适配器将220V转换为110V");
    }
}

(4)客户端代码(Client)

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 现有的欧洲插座
        EUPlug euPlug = new EUPlug();

        // 创建适配器,将欧洲插座转换为美国标准
        USPlug usPlug = new EUToUSAdapter(euPlug);

        // 客户端使用适配后的接口
        usPlug.supplyPower110V();
    }
}

输出结果:

java 复制代码
提供220V电压
通过适配器将220V转换为110V

适配器模式的优点

  1. 接口兼容

    使原本不兼容的类可以协同工作。

  2. 复用现有代码

    无需修改适配者的代码,直接通过适配器复用功能。

  3. 灵活扩展

    可以适配多个不同的类,甚至结合其他模式(如工厂模式)动态选择适配器。

适配器模式的缺点

  1. 增加复杂性

    引入适配器类会增加代码层级,可能使系统变得复杂。

  2. 性能开销

    额外的适配器调用可能带来轻微的性能损耗(通常可忽略)。

类适配器 vs 对象适配器

类适配器(Java中不可用,需多继承)

java 复制代码
public class Adapter extends Adaptee implements Target {
    @Override
    public void targetMethod() {
        super.adapteeMethod();
    }
}

对象适配器(推荐使用)

java 复制代码
public class Adapter implements Target {
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void targetMethod() {
        adaptee.adapteeMethod();
    }
}

适配器模式的实际应用

  • Java中的InputStreamReader和OutputStreamWriter

    将字节流(InputStream/OutputStream)适配为字符流(Reader/Writer)。

    java 复制代码
    Reader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
  • Spring框架中的HandlerAdapter

    在Spring MVC中,HandlerAdapter将不同类型的处理器(如Servlet、Controller)适配为统一的处理接口。

  • Android中的RecyclerView.Adapter

    将数据集合适配为RecyclerView可显示的视图项。

应用场景

  1. 系统升级或整合

    旧系统与新系统接口不兼容时,通过适配器过渡。

  2. 第三方库适配

    使用第三方库时,接口与现有代码不匹配。

  3. 统一多个类的接口

    需要将多个不同接口的类统一为同一接口供客户端使用。

总结

适配器模式是解决接口不兼容问题的利器,通过中间层(适配器)实现接口转换。它在系统升级、整合第三方库等场景中广泛应用,是提升代码复用性和灵活性的重要手段。

相关推荐
烛阴4 分钟前
【TS 设计模式完全指南】用工厂方法模式打造你的“对象生产线”
javascript·设计模式·typescript
渣哥17 分钟前
ConcurrentHashMap 的 get 要不要加锁?一次“多此一举”的心路历程
java
愿你天黑有灯下雨有伞25 分钟前
一种基于注解与AOP的Spring Boot接口限流防刷方案
java·spring boot·后端
MuMuMu#31 分钟前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio
拾忆,想起38 分钟前
Redis复制延迟全解析:从毫秒到秒级的优化实战指南
java·开发语言·数据库·redis·后端·缓存·性能优化
我登哥MVP38 分钟前
Java File 类学习笔记
java·笔记·学习
掘根42 分钟前
【CMake】缓存变量
java·后端·spring
西京刀客1 小时前
macos安装openjdk17
java·macos·java17
Java中文社群2 小时前
面试官:如何实现动态线程池的任务编排?
java·后端·面试
lozhyf2 小时前
能发弹幕的简单视频网站
java·spring boot·后端