设计模式-适配器模式

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

核心思想

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

  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. 统一多个类的接口

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

总结

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

相关推荐
devmoon几秒前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
野犬寒鸦4 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
云姜.8 分钟前
java抽象类和接口
java·开发语言
带刺的坐椅8 分钟前
Claude Code Skills,Google A2A Skills,Solon AI Skills 有什么区别?
java·ai·solon·a2a·claudecode·skills
爱学英语的程序员20 分钟前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
callJJ1 小时前
Spring AI 文本聊天模型完全指南:ChatModel 与 ChatClient
java·大数据·人工智能·spring·spring ai·聊天模型
CBeann1 小时前
企业级规则引擎落地实战:动态脚本引擎 QLExpress ,真香!
java·ai·大模型·规则引擎·qlexpress·大厂实战项目
懈尘1 小时前
从 Java 1.7 到 Java 21:逐版本深入解析新特性与平台演进
java·开发语言
亓才孓1 小时前
[Maven]Maven基础
java·maven
hello 早上好1 小时前
05_Java 类加载过程
java·开发语言