适配器模式
介绍
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的对象能够相互合作。适配器模式充当两个不兼容接口之间的桥梁,将一个类的接口转换成客户端所期望的另一个接口。
原理
适配器模式的核心原理包括:
- 目标接口:客户端期望的接口
- 适配者:需要被适配的类
- 适配器:实现目标接口,并包装适配者对象
图示
+----------------+ +----------------+
| Target | | Client |
+----------------+ +----------------+
| + request() |<-------| + main() |
+-------^--------+ +----------------+
|
+-------+--------+
| Adapter |
+----------------+
| - adaptee |
| + request() |
+-------^--------+
|
+-------+--------+
| Adaptee |
+----------------+
| + specificRequest()|
+----------------+
代码示例
目标接口
public interface Target {
void request();
}
适配者
public class Adaptee {
public void specificRequest() {
System.out.println("适配者的特定请求");
}
}
适配器(类适配器)
public class ClassAdapter extends Adaptee implements Target {
@Override
public void request() {
specificRequest();
}
}
适配器(对象适配器)
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
客户端代码
public class Client {
public static void main(String[] args) {
// 使用类适配器
Target classAdapter = new ClassAdapter();
classAdapter.request();
// 使用对象适配器
Adaptee adaptee = new Adaptee();
Target objectAdapter = new ObjectAdapter(adaptee);
objectAdapter.request();
}
}
解决方案
应用场景
- 集成第三方库:当需要使用的第三方库接口与现有系统接口不兼容时
- 旧系统改造:在不修改旧系统代码的情况下,使其与新系统交互
- 复用现有类:复用已有的类,但接口不符合当前需求
- 测试驱动开发:为测试创建模拟对象
最佳实践
- 优先使用对象适配器:更灵活,符合组合优于继承的原则
- 明确适配目的:确保适配器的使用是为了解决接口不兼容问题,而不是为了弥补设计缺陷
- 避免过度使用:不要为了使用适配器而创建不必要的适配层
- 考虑使用默认适配器:为接口提供默认实现,减少适配器的实现成本
优缺点
优点:
- 解决接口不兼容问题
- 复用现有代码
- 隔离客户端与适配者的变化
- 提高代码的可扩展性
缺点:
- 增加代码复杂度
- 可能导致系统中出现过多的适配器类
工具推荐
- Apache Commons Collections:提供多种适配器,如ListAdapter、SetAdapter等
- Guava:提供适配器工具类,如Maps.transformValues()
- Spring Framework:提供适配器模式的实现,如HandlerAdapter
- Java API:内置多种适配器,如InputStreamReader(字节流到字符流的适配器)