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

速记口诀

  • 旧接口不兼容,适配器当中转;
  • 继承或组合,对象适配最安全;
  • 列表适配器,安卓天天见!
相关推荐
yoyo_zzm4 小时前
Laravel6.x新特性全解析
java·spring boot·后端
AIFarmer4 小时前
【无标题】
开发语言·c++·算法
Nick_zcy4 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝4 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
昇腾CANN4 小时前
TileLang-Ascend 算子性能优化方法与实操
开发语言·javascript·性能优化·昇腾·cann
沐知全栈开发4 小时前
ionic 手势事件详解
开发语言
lsx2024065 小时前
Bootstrap 按钮
开发语言
qinqinzhang5 小时前
Java 中的 IoC、AOP、MVC
java
神仙别闹5 小时前
基于 Python 实现 BERT 的情感分析模型
开发语言·python·bert
禾叙_5 小时前
【langchain4j】结构化输出(六)
java·开发语言