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

速记口诀

  • 旧接口不兼容,适配器当中转;
  • 继承或组合,对象适配最安全;
  • 列表适配器,安卓天天见!
相关推荐
笨笨马甲1 小时前
Qt MQTT
开发语言·qt
sinat_255487811 小时前
教授提供的有用链接 — 20·学习笔记
java
Java面试题总结1 小时前
2026Java面试八股文合集(持续更新)
java·spring·面试·职场和发展·java面试·java八股文
一勺菠萝丶1 小时前
芋道框架 - API 前缀区分机制
java·linux·python
kcuwu.1 小时前
Python判断及循环
android·java·python
前进的李工2 小时前
LangChain使用之Model IO(提示词模版之ChatPromptTemplate)
java·前端·人工智能·python·langchain·大模型
Fairy要carry2 小时前
面试-Agent上下文过载、步骤混乱的问题
开发语言·python
ywf12152 小时前
Spring Integration + MQTT
java·后端·spring
程序员Ctrl喵2 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter