跳到主要内容

适配器模式

介绍

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的对象能够相互合作。适配器模式充当两个不兼容接口之间的桥梁,将一个类的接口转换成客户端所期望的另一个接口。

原理

适配器模式的核心原理包括:

  1. 目标接口:客户端期望的接口
  2. 适配者:需要被适配的类
  3. 适配器:实现目标接口,并包装适配者对象

图示

+----------------+        +----------------+
| 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();
}
}

解决方案

应用场景

  1. 集成第三方库:当需要使用的第三方库接口与现有系统接口不兼容时
  2. 旧系统改造:在不修改旧系统代码的情况下,使其与新系统交互
  3. 复用现有类:复用已有的类,但接口不符合当前需求
  4. 测试驱动开发:为测试创建模拟对象

最佳实践

  1. 优先使用对象适配器:更灵活,符合组合优于继承的原则
  2. 明确适配目的:确保适配器的使用是为了解决接口不兼容问题,而不是为了弥补设计缺陷
  3. 避免过度使用:不要为了使用适配器而创建不必要的适配层
  4. 考虑使用默认适配器:为接口提供默认实现,减少适配器的实现成本

优缺点

优点

  • 解决接口不兼容问题
  • 复用现有代码
  • 隔离客户端与适配者的变化
  • 提高代码的可扩展性

缺点

  • 增加代码复杂度
  • 可能导致系统中出现过多的适配器类

工具推荐

  1. Apache Commons Collections:提供多种适配器,如ListAdapter、SetAdapter等
  2. Guava:提供适配器工具类,如Maps.transformValues()
  3. Spring Framework:提供适配器模式的实现,如HandlerAdapter
  4. Java API:内置多种适配器,如InputStreamReader(字节流到字符流的适配器)