适配器模式(Adapter Pattern)是一种 结构型设计模式,用于在两个不兼容的接口之间建立桥梁,使它们可以协同工作。它通常用于让已有的类与新接口兼容,而无需修改原有代码。
1. 适配器模式的基本结构
适配器模式有三种主要形式:
- 对象适配器(基于组合)
- 类适配器(基于继承)
- 接口适配器(基于抽象类)
(1) 角色组成
- 目标接口(Target):定义客户期望的接口。
- 被适配者(Adaptee):需要适配的类,通常已有不兼容的方法。
- 适配器(Adapter):连接
Target和Adaptee,使其兼容。
2. 适配器模式的实现
(1) 对象适配器模式(推荐,基于组合)
对象适配器使用 组合 方式,让适配器持有 Adaptee 实例,在 Adapter 中调用 Adaptee 的方法。
示例:将 220V 电压适配为 5V
// 目标接口:手机充电器希望得到 5V 电压
interface Voltage5V {
int output5V();
}
// 被适配者:现有 220V 电压
class Voltage220V {
public int output220V() {
return 220;
}
}
// 适配器:适配 220V 到 5V
class VoltageAdapter implements Voltage5V {
private Voltage220V voltage220V; // 组合方式
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int src = voltage220V.output220V();
return src / 44; // 转换为 5V
}
}
// 客户端代码
public class AdapterPatternDemo {
public static void main(String[] args) {
Voltage220V voltage220V = new Voltage220V();
VoltageAdapter adapter = new VoltageAdapter(voltage220V);
System.out.println("输出电压:" + adapter.output5V() + "V");
}
}
优点:
- 遵循 组合优先于继承,不改变
Adaptee的代码。 - 可以适配多个
Adaptee,更灵活。
(2) 类适配器模式(基于继承)
类适配器使用 继承 方式,使 Adapter 继承 Adaptee 并实现 Target 接口。
示例
// 适配器:继承 Voltage220V,实现 Voltage5V
class VoltageClassAdapter extends Voltage220V implements Voltage5V {
@Override
public int output5V() {
int src = output220V(); // 直接调用父类方法
return src / 44;
}
}
缺点:
- 由于 Java 不支持多继承,适配器无法同时适配多个
Adaptee。 - 适配器与
Adaptee绑定,不够灵活。
(3) 接口适配器模式(缺省适配器,基于抽象类)
适用于接口中有多个方法,但客户端只需实现其中一部分的情况。
示例:自定义 MouseListener
// 原始接口
interface MouseListener {
void onClick();
void onDoubleClick();
void onRightClick();
}
// 适配器:提供默认实现,子类只需实现需要的方法
abstract class MouseAdapter implements MouseListener {
@Override public void onClick() {}
@Override public void onDoubleClick() {}
@Override public void onRightClick() {}
}
// 只关心单击事件的子类
class ClickListener extends MouseAdapter {
@Override
public void onClick() {
System.out.println("单击事件触发");
}
}
优点:
- 让子类只需覆盖需要的方法,避免实现所有方法。
- 常用于 Java Swing、
Servlet API的监听器适配。
3. 适配器模式在 Java 框架中的应用
| 场景 | 适配器 | 作用 |
|---|---|---|
| Spring MVC | HandlerAdapter | 适配不同类型的 Controller |
| Spring AOP | AdvisorAdapter | 适配不同类型的通知(Advice) |
| Java I/O | InputStreamReader | 适配 InputStream 和 Reader |
| Servlet 监听器 | ServletRequestListener | 适配不同类型的请求事件 |
| JDBC | DriverAdapter | 适配不同数据库驱动 |
4. 适配器模式 vs 其他模式
| 模式 | 目的 |
|---|---|
| 适配器模式 | 让已有类兼容新接口,解决接口不兼容问题 |
| 装饰器模式 | 在不改变原类的基础上增强功能 |
| 桥接模式 | 让抽象部分和实现部分分离,支持扩展 |
5. 适配器模式的优缺点
✅ 优点
- 解耦:让原本不兼容的类可以协同工作,而不修改原有代码。
- 复用:可以复用
Adaptee,减少重复代码。 - 扩展性强:对象适配器模式可以适配多个
Adaptee,不受继承限制。
❌ 缺点
- 可能增加系统复杂度:引入额外的适配器层,增加类的数量。
- 类适配器受限:由于 Java 不支持多继承,类适配器不能适配多个
Adaptee。
6. 总结
- 对象适配器(推荐):使用 组合 方式,灵活性高,适用于大多数情况。
- 类适配器(局限性):使用 继承,不能适配多个
Adaptee。 - 接口适配器(缺省适配):适用于接口方法多,但只需要部分实现的情况。
Java 适配器模式的典型应用包括 Spring MVC HandlerAdapter、Java I/O InputStreamReader、AOP AdvisorAdapter 等,是一种非常常见的设计模式。
788

被折叠的 条评论
为什么被折叠?



