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

速记口诀

  • 旧接口不兼容,适配器当中转;
  • 继承或组合,对象适配最安全;
  • 列表适配器,安卓天天见!
相关推荐
zfoo-framework12 分钟前
1.ansible安装 2.虚拟机克隆
java
码上解惑22 分钟前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
小大宇1 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
青山木1 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
柒星栈1 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之2 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
程序员-珍2 小时前
报错下载android sdk失败
android·java
糖果店的幽灵2 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
吃饱了得干活2 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试
这是个栗子2 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at