适配器模式 (Adapter Pattern)
适配器模式是一种结构型设计模式,用于解决两个不兼容接口之间的兼容性问题,充当两个不同接口之间的桥梁。
🌟 核心思想
转换接口:将一个类的接口转换成客户端期望的另一个接口,使原本不兼容的类能够协同工作。
🧩 模式结构
组件 | 说明 |
---|---|
Target | 客户端期望的目标接口 |
Adaptee | 需要被适配的已存在类(不兼容的类) |
Adapter | 适配器类,实现 Target 接口并包装 Adaptee 对象 |
Client | 使用 Target 接口的客户端 |
🔧 两种实现方式
1. 类适配器(通过继承)
java
// 目标接口
interface USB {
void connect();
}
// 被适配的类
class TypeC {
public void typeCConnect() {
System.out.println("Type-C connected");
}
}
// 适配器 (继承方式)
class TypeCToUSBAdapter extends TypeC implements USB {
@Override
public void connect() {
typeCConnect(); // 调用父类方法
}
}
2. 对象适配器(通过组合)
java
// 适配器 (组合方式)
class TypeCToUSBAdapter implements USB {
private TypeC typeC;
public TypeCToUSBAdapter(TypeC typeC) {
this.typeC = typeC;
}
@Override
public void connect() {
typeC.typeCConnect(); // 调用被适配对象方法
}
}
📝 客户端使用
java
public class Client {
public static void main(String[] args) {
// 类适配器使用
USB adapter1 = new TypeCToUSBAdapter();
adapter1.connect();
// 对象适配器使用
TypeC typeC = new TypeC();
USB adapter2 = new TypeCToUSBAdapter(typeC);
adapter2.connect();
}
}
💡 适用场景
- 需要使用现有类但其接口不符合需求
- 需要创建可复用的类(与未知接口协作)
- 需要统一多个不同接口的类
- 系统扩展时需兼容旧接口
✅ 优点
- 接口兼容:解决不兼容接口问题
- 复用性:重用现有类无需修改源码
- 解耦:客户端与具体实现解耦
- 开闭原则:可引入新适配器而不修改客户端
⚠️ 缺点
- 过度使用会导致系统结构复杂化
- 部分语言不支持多重继承(限制类适配器)
- 可能引入额外性能开销
🌐 实际应用案例
- Java I/O :
InputStreamReader
(适配InputStream
到Reader
) - 集合框架 :
Arrays.asList()
适配数组到List - GUI开发:不同操作系统组件的适配
- 日志框架:SLF4J 适配不同日志实现
- 电源适配器:220V ➡️ 110V 电压转换
🆚 模式对比
模式 | 目的 | 关键区别 |
---|---|---|
适配器模式 | 接口转换 | 解决已有接口不兼容问题 |
装饰器模式 | 增强功能 | 保持接口不变添加功能 |
外观模式 | 简化复杂系统接口 | 定义新接口整合子系统 |
💡 黄金法则 :适配器模式关注接口转换 ,装饰器模式关注功能增强 ,外观模式关注接口简化。
代码示例(现实场景)
java
// 欧洲标准插座
interface EuropeanSocket {
void plugInEurope();
}
// 中国标准插座(被适配类)
class ChineseSocket {
public void plugInChina() {
System.out.println("中国标准三脚插头已连接");
}
}
// 适配器(旅游转换插头)
class SocketAdapter implements EuropeanSocket {
private ChineseSocket chineseSocket;
public SocketAdapter(ChineseSocket socket) {
this.chineseSocket = socket;
}
@Override
public void plugInEurope() {
System.out.println("使用转换器...");
chineseSocket.plugInChina();
}
}
// 欧洲电器(客户端)
class EuropeanDevice {
public void useDevice(EuropeanSocket socket) {
socket.plugInEurope();
}
}
// 使用示例
public class TravelDemo {
public static void main(String[] args) {
ChineseSocket wallSocket = new ChineseSocket();
SocketAdapter adapter = new SocketAdapter(wallSocket);
EuropeanDevice laptop = new EuropeanDevice();
laptop.useDevice(adapter); // 成功使用中国插座
}
}
输出结果:
使用转换器...
中国标准三脚插头已连接
适配器模式是系统集成和代码复用中的重要工具,特别在需要兼容旧系统或整合第三方库时,能有效降低系统耦合度。