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
速记口诀
- 旧接口不兼容,适配器当中转;
- 继承或组合,对象适配最安全;
- 列表适配器,安卓天天见!