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