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

速记口诀

  • 旧接口不兼容,适配器当中转;
  • 继承或组合,对象适配最安全;
  • 列表适配器,安卓天天见!
相关推荐
程序员黑豆40 分钟前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年2 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅2 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148112 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小席是个热心肠2 小时前
AI相关的自我学习
java·人工智能·学习
知无不研5 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记5 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29145 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统6 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
C++ 老炮儿的技术栈6 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐