场景描述:电源电压转换
假设我们有一个220V交流电源(现有类),但客户端需要5V直流电(目标接口)。适配器模式可以帮助我们实现电压转换而不修改现有代码。
代码实现
1. 目标接口(5V直流电)
java
// 目标接口:客户端期望的5V直流电
public interface DC5 {
int outputDC5V();
}
2. 被适配类(220V交流电)
java
// 被适配者:已存在的220V交流电类
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出交流电:" + output + "V");
return output;
}
}
3. 适配器类(对象适配器实现)
java
// 对象适配器:通过组合方式实现
public class PowerAdapter implements DC5 {
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int outputDC5V() {
int input = ac220.outputAC220V();
// 电压转换:220V交流电转为5V直流电
int output = input / 44;
System.out.println("适配器工作:将" + input + "V交流电转换为" + output + "V直流电");
return output;
}
}
4. 客户端代码
java
public class Client {
public static void main(String[] args) {
// 现有的220V交流电源
AC220 ac220 = new AC220();
// 创建适配器,将220V交流电适配为5V直流电
DC5 powerAdapter = new PowerAdapter(ac220);
// 客户端使用统一的5V接口
System.out.println("获得直流电压:" + powerAdapter.outputDC5V() + "V");
}
}
5. 运行结果
md
输出交流电:220V
适配器工作:将220V交流电转换为5V直流电
获得直流电压:5V
适配器模式的优越性体现
1. 解耦性 ✅
客户端只依赖DC5接口,完全不知道AC220类的存在。如果电压转换逻辑需要修改,只需调整适配器类,客户端代码无需变动。
2. 复用性 ✅
现有的AC220类可以继续在原有系统中使用,同时通过适配器在新系统中重用,避免了代码重复。
3. 灵活性 ✅
可以轻松扩展新的适配器。比如增加一个将110V转换为5V的适配器:
java
public class USPowerAdapter implements DC5 {
private AC110 ac110;
public USPowerAdapter(AC110 ac110) {
this.ac110 = ac110;
}
@Override
public int outputDC5V() {
int input = ac110.outputAC110V();
return input / 22;
}
}
客户端使用方式不变,符合开闭原则。
4. 兼容旧系统 ✅
在系统升级或集成第三方库时特别有用。例如,JDBC驱动就是适配器模式的典型应用,它将不同数据库的接口适配为统一的JDBC接口。
对比:没有使用适配器模式的问题
如果直接修改AC220类来支持5V输出:
java
// 不推荐的做法:修改原有类
public class AC220 {
public int outputAC220V() { /* ... */ }
// 新增方法:破坏类的单一职责原则
public int outputDC5V() {
return outputAC220V() / 44;
}
}
这种直接修改 方式的缺点:
违反开闭原则:需要修改已测试通过的类
职责混杂:一个类承担多种功能
难以维护:随着需求变化,类会变得越来越复杂