定义
Java适配器模式(Adapter Pattern)是一种结构型设计模式,其核心思想是通过创建一个适配器类,将一个类的接口转换成客户希望的另一个接口,从而使原本由于接口不兼容而不能一起工作的类可以协同工作。简单来说,适配器模式就像是一个翻译官,在两种不同 “语言”(接口)之间进行转换,使得双方能够顺利沟通。
核心概念
适配器模式通过转换接口实现不兼容对象间的协作,包含三个角色:
- 目标接口(Target):客户端期望的接口
- 被适配者(Adaptee):需要被适配的现存组件
- 适配器(Adapter):实现接口转换的中间件
在 Java 中,适配器模式主要有两种实现方式:类适配器和对象适配器。
代码示例
// 目标接口:标准电压输出
interface Voltage5V {
int output5V();
}
// 被适配者:家用220V电源
class Household220V {
public int output220V() {
System.out.println("输出220V交流电");
return 220;
}
}
类适配器
类适配器通过继承来实现适配功能。适配器类同时继承被适配者类和实现目标接口。这种方式在 Java 中受到一定限制,因为 Java 只支持单继承,所以适配器类只能适配一个被适配者类。
// 类适配器(继承实现)
class ClassAdapter extends Household220V implements Voltage5V {
@Override
public int output5V() {
int src = super.output220V();
System.out.println("电压转换:220V -> 5V");
return src / 44;
}
}
对象适配器
对象适配器通过组合来实现适配功能。适配器类实现目标接口,并持有一个被适配者对象的引用。这种方式更加灵活,因为适配器类可以通过持有不同的被适配者对象来适配多个不同的被适配者。
// 对象适配器(组合实现)
class ObjectAdapter implements Voltage5V {
private Household220V household220V;
public ObjectAdapter(Household220V household220V) {
this.household220V = household220V;
}
@Override
public int output5V() {
int src = household220V.output220V();
System.out.println("电压转换:220V -> 5V");
return src / 44;
}
}
两种实现对比
特性 | 类适配器 | 对象适配器 |
---|---|---|
实现方式 | 继承被适配类 | 组合被适配对象 |
灵活性 | 单继承限制 | 可适配多个不同对象 |
方法覆盖 | 可重写父类方法 | 无法直接访问私有方法 |
目标接口 | 实现接口 | 实现接口 |
典型应用场景
- 旧系统功能复用
- 第三方库接口适配
- 统一多个类的接口
- 跨平台兼容性处理
注意事项:
- 优先使用组合而非继承
- 避免创建过多小型适配器
- 接口设计应保持适度前瞻性
- 在系统演化过程中及时重构冗余适配器
通过合理使用适配器模式,可以提高代码的复用性和系统的扩展性,但需注意避免因过度包装导致系统复杂度增加。