Java设计模式 八 适配器模式 (Adapter Pattern)

适配器模式 (Adapter Pattern)

适配器模式 是一种结构型设计模式,其核心思想是将一个类的接口转换为客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作。


1. 适配器模式的组成

  • Target(目标接口): 定义客户端所期望的接口。
  • Adaptee(适配者类): 定义了一个现有的接口,需要适配的类。
  • Adapter(适配器类): 实现目标接口,并将适配者类的功能包装为目标接口的功能。
  • Client(客户端): 调用目标接口中的方法,间接通过适配器类使用适配者类的功能。

2. 适配器模式的分类

1) 类适配器

通过继承实现适配器功能。

  • 优点: 适配器可以重写适配者的方法。
  • 缺点: Java 不支持多继承,如果目标接口和适配者类不属于同一个继承体系,类适配器无法使用。
2) 对象适配器

通过组合实现适配器功能。

  • 优点: 适配器可以适配多个适配者对象,更加灵活。
  • 缺点: 需要额外维护适配者对象的引用。

3. 适配器模式的实现

1) 类适配器实现

示例代码:

java 复制代码
// 目标接口
public interface Target {
    void request();
}

// 适配者类(已有接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request from Adaptee.");
    }
}

// 类适配器
public class ClassAdapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Target target = new ClassAdapter();
        target.request();  // 输出: Specific request from Adaptee.
    }
}
2) 对象适配器实现

示例代码:

java 复制代码
// 目标接口
public interface Target {
    void request();
}

// 适配者类(已有接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request from Adaptee.");
    }
}

// 对象适配器
public class ObjectAdapter implements Target {
    private Adaptee adaptee;

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

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();  // 输出: Specific request from Adaptee.
    }
}

4. 适配器模式的优点

  1. 提高类的复用性: 通过适配器,可以使已有的类满足新的需求。
  2. 提高类的灵活性: 目标接口和适配者类可以独立扩展,而不会相互影响。
  3. 解耦: 客户端不需要直接依赖适配者类,与目标接口解耦。

5. 适配器模式的缺点

  1. 类适配器的局限性: 类适配器使用继承方式实现,受到 Java 单继承的限制。
  2. 系统复杂性增加: 引入适配器后,可能会使系统设计增加额外的复杂性。

6. 适配器模式的使用场景

  1. 现有类的接口与目标接口不兼容时:

    比如使用第三方库或遗留系统中的类,但它们的接口不符合当前需求。

  2. 希望复用一些现有的类,而这些类的接口与当前系统不兼容时:

    通过适配器封装现有类的功能,提供兼容的新接口。

  3. 需要将多个类统一到同一个接口时:

    可以使用适配器模式将不同类的接口统一为目标接口。


7. 适配器模式与其他模式的比较

设计模式 作用 与适配器模式的区别
桥接模式 分离抽象部分和实现部分,使两者可以独立变化 桥接模式是设计新系统时的结构设计,适配器用于现有系统的改造。
装饰器模式 动态添加新功能 装饰器模式扩展对象功能,适配器模式主要解决接口不兼容问题。
代理模式 控制对某对象的访问 代理模式不改变接口,适配器模式会转换接口。

8. Java 中的典型应用

1) java.util.Arrays 中的 asList 方法

将数组适配为 List

java 复制代码
String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);
2) java.io.InputStreamReader

InputStream 适配为 Reader

java 复制代码
InputStream inputStream = new FileInputStream("file.txt");
Reader reader = new InputStreamReader(inputStream);
3) javax.xml.bind.annotation.adapters.XmlAdapter

适配 XML 数据与 Java 对象的转换。


9. 总结

适配器模式是一种解决接口不兼容问题 的有效方法,尤其在代码重用和系统整合时尤为常用。它可以通过类适配器和对象适配器实现,分别基于继承和组合的方式。

在实际开发中,适配器模式广泛应用于系统改造兼容第三方库的场景,可以显著提高代码的复用性和灵活性。

相关推荐
专职1 分钟前
spring boot中实现手动分页
java·spring boot·后端
神探阿航17 分钟前
第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
java·算法·蓝桥杯
梓沂27 分钟前
idea修改模块名导致程序编译出错
java·ide·intellij-idea
m0_748230441 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔1 小时前
Java面试题2025-Mysql
java·spring boot·后端
心之语歌2 小时前
LiteFlow Spring boot使用方式
java·开发语言
计算机-秋大田2 小时前
基于微信小程序的校园失物招领系统设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
綦枫Maple2 小时前
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
java·spring boot·后端
极客先躯2 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
码至终章2 小时前
kafka常用目录文件解析
java·分布式·后端·kafka·mq