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