适配器模式是一种结构型设计模式
,用于将一个类的接口转换为客户端期望的另一个接口
,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题
,类似于电源插头转换器。
核心思想
适配器模式通过以下方式实现接口的兼容:
- 定义
目标接口
(Target):客户端期望使用的接口。 - 引入
适配者类
(Adaptee):需要被适配的现有类(接口不兼容)。 - 创建
适配器类
(Adapter):将适配者的接口转换为目标接口。
适配器模式分为两种实现方式:
类适配器
:通过继承适配者类实现目标接口(需要支持多继承,Java中不适用)。对象适配器
:通过组合(持有适配者的实例)实现目标接口(更灵活,推荐使用)。
适配器模式的结构
适配器模式包含以下角色:
- 目标接口(Target)
- 客户端期望使用的接口。
- 定义客户端需要的方法。
- 适配者类(Adaptee)
- 需要被适配的现有类(接口与目标接口不兼容)。
- 适配器类(Adapter)
- 实现目标接口,并持有适配者的实例。
- 在目标接口方法中调用适配者的方法,完成接口转换。
实现示例
假设有一个欧洲标准的插座(220V),而客户端需要一个美国标准的插座(110V)。通过适配器模式实现电压转换。
(1)目标接口(Target)
java
// 客户端期望的接口:美国标准插座(110V)
public interface USPlug {
void supplyPower110V();
}
(2)适配者类(Adaptee)
java
// 现有的欧洲标准插座(220V)
public class EUPlug {
public void supplyPower220V() {
System.out.println("提供220V电压");
}
}
(3)适配器类(Adapter)
java
// 适配器:将欧洲插座转换为美国标准
public class EUToUSAdapter implements USPlug {
private EUPlug euPlug; // 持有适配者的实例
public EUToUSAdapter(EUPlug euPlug) {
this.euPlug = euPlug;
}
@Override
public void supplyPower110V() {
euPlug.supplyPower220V();
System.out.println("通过适配器将220V转换为110V");
}
}
(4)客户端代码(Client)
java
public class Client {
public static void main(String[] args) {
// 现有的欧洲插座
EUPlug euPlug = new EUPlug();
// 创建适配器,将欧洲插座转换为美国标准
USPlug usPlug = new EUToUSAdapter(euPlug);
// 客户端使用适配后的接口
usPlug.supplyPower110V();
}
}
输出结果:
java
提供220V电压
通过适配器将220V转换为110V
适配器模式的优点
-
接口兼容
使原本不兼容的类可以协同工作。
-
复用现有代码
无需修改适配者的代码,直接通过适配器复用功能。
-
灵活扩展
可以适配多个不同的类,甚至结合其他模式(如工厂模式)动态选择适配器。
适配器模式的缺点
-
增加复杂性
引入适配器类会增加代码层级,可能使系统变得复杂。
-
性能开销
额外的适配器调用可能带来轻微的性能损耗(通常可忽略)。
类适配器 vs 对象适配器
类适配器(Java中不可用,需多继承)
java
public class Adapter extends Adaptee implements Target {
@Override
public void targetMethod() {
super.adapteeMethod();
}
}
对象适配器(推荐使用)
java
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void targetMethod() {
adaptee.adapteeMethod();
}
}
适配器模式的实际应用
-
Java中的InputStreamReader和OutputStreamWriter
将字节流(InputStream/OutputStream)适配为字符流(Reader/Writer)。
javaReader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
-
Spring框架中的HandlerAdapter
在Spring MVC中,HandlerAdapter将不同类型的处理器(如Servlet、Controller)适配为统一的处理接口。
-
Android中的RecyclerView.Adapter
将数据集合适配为RecyclerView可显示的视图项。
应用场景
-
系统升级或整合
旧系统与新系统接口不兼容时,通过适配器过渡。
-
第三方库适配
使用第三方库时,接口与现有代码不匹配。
-
统一多个类的接口
需要将多个不同接口的类统一为同一接口供客户端使用。
总结
适配器模式是解决接口不兼容问题
的利器,通过中间层(适配器)实现接口转换。它在系统升级、整合第三方库等场景中广泛应用,是提升代码复用性和灵活性的重要手段。