Java 适配器模式(Adapter Pattern)

Java 适配器模式(Adapter Pattern)

适配器模式是结构型设计模式,核心作用:让不兼容的两个接口 / 类能一起工作。

生活例子:

  • 手机充电:Type-C 转 Lightning
  • 电源插头:两脚转三脚
  • 翻译官:中文 ↔ 英文
    一句话总结:适配器 = 中间翻译官,把 A 接口转成 B 接口。

一、核心角色

  • 目标接口(Target):客户端要使用的接口
  • 适配者(Adaptee):已存在、但不兼容的旧接口
  • 适配器(Adapter):中间转换类,核心
  • 客户端(Client):调用目标接口

二、两种实现方式

1. 类适配器(继承实现)

适配器继承适配者,实现目标接口。

复制代码
// 1. 目标接口(客户端要用)
interface Target {
    void request();
}

// 2. 适配者(旧接口,不兼容)
class Adaptee {
    public void specificRequest() {
        System.out.println("旧接口功能");
    }
}

// 3. 适配器(继承+实现)
class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        // 调用旧方法,完成转换
        specificRequest();
    }
}

// 测试
public class Test {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request(); // 输出:旧接口功能
    }
}

优点:简单缺点:Java 单继承,有局限性

2. 对象适配器(组合实现,推荐 🔥)

适配器持有适配者对象,实现目标接口(Java 最常用)。

复制代码
// 1. 目标接口
interface USB {
    void connect();
}

// 2. 适配者(不兼容)
class TypeC {
    public void transfer() {
        System.out.println("Type-C 传输数据");
    }
}

// 3. 适配器(组合方式)
class USBAdapter implements USB {
    // 持有适配者对象
    private TypeC typeC;

    public USBAdapter(TypeC typeC) {
        this.typeC = typeC;
    }

    @Override
    public void connect() {
        // 转换调用
        typeC.transfer();
    }
}

// 测试
public class ObjectAdapterTest {
    public static void main(String[] args) {
        TypeC typeC = new TypeC();
        USB usb = new USBAdapter(typeC);
        usb.connect(); // Type-C 传输数据
    }
}
优点:
  • 不破坏单继承
  • 低耦合、灵活
  • Android/Java 项目首选

三、Android 经典实战例子

Android 最经典的适配器:ListView / RecyclerView Adapter

复制代码
// 目标接口:ListView 需要的列表接口
interface ListAdapter {
    View getView(int position);
}

// 适配者:我们的数据集合
class DataSource {
    public String getData(int pos) {
        return "数据" + pos;
    }
}

// 适配器:把数据转成 ItemView
class MyAdapter implements ListAdapter {
    private DataSource dataSource;

    public MyAdapter(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public View getView(int position) {
        String data = dataSource.getData(position);
        return new View(data); // 转换成列表项
    }
}
Android 无处不在:
  • RecyclerView.Adapter
  • BaseAdapter
  • CursorAdapter

四、适用场景

  • 旧接口与新接口不兼容
  • 复用现有类,但接口不符合需求
  • 需要统一多个类的接口
  • Android 列表控件必用

五、优点

  • 解耦:调用方不用改代码
  • 复用:不用重写旧代码
  • 灵活:切换适配器即可换功能
  • 符合开闭原则

六、一句话总结

  • 适配器模式 = 不兼容 → 兼容
  • 类适配器:继承
  • 对象适配器:组合(推荐)
  • Android 代表:各种 Adapter

速记口诀

  • 旧接口不兼容,适配器当中转;
  • 继承或组合,对象适配最安全;
  • 列表适配器,安卓天天见!
相关推荐
邪修king33 分钟前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料1 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y2 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
阿里嘎多学长6 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
曹牧6 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头7 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记7 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
小羊没烦恼!7 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
紧跟先前的步伐7 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵7 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程