设计模式-适配器模式

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

核心思想

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

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

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

总结

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

相关推荐
炎芯随笔20 分钟前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
goTsHgo21 分钟前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder29 分钟前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
pjx98739 分钟前
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
java·spring cloud·微服务·eureka
多多*1 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥1 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
唐僧洗头爱飘柔95272 小时前
【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
java·spring·mybatis·springmvc·动态代理·ioc容器·视图控制器
骑牛小道士2 小时前
Java基础 集合框架 Collection接口和抽象类AbstractCollection
java
alden_ygq3 小时前
当java进程内存使用超过jvm设置大小会发生什么?
java·开发语言·jvm
triticale3 小时前
【Java】网络编程(Socket)
java·网络·socket