设计模式-适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而无法工作的类能够一起工作。
适配器模式的角色组成:
- 目标接口(Target):
- 定义客户端需要的接口。
- 需要适配的类(Adaptee):
- 现有的接口或类,其接口与目标接口不兼容。
- 适配器类(Adapter):
- 实现目标接口,并通过内部调用需要适配的类的方法,使其行为符合目标接口。
- 客户端(Client):
- 通过目标接口与适配器类交互。
示例代码:电源适配器
问题背景
假设有一个设备只能使用 110V 电压,但我们当前提供的是 220V 电压。我们需要通过适配器将 220V 转换成 110V,使设备能够正常工作。
实现代码
// 目标接口(Target):设备需要的电压
interface Voltage110V {
void use110V();
}
// 被适配的类(Adaptee):现有的电压
class Voltage220V {
public void provide220V() {
System.out.println("提供220V电压");
}
}
// 适配器类(Adapter):将220V转换为110V
class VoltageAdapter implements Voltage110V {
private final Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public void use110V() {
System.out.println("通过适配器转换电压...");
voltage220V.provide220V();
System.out.println("电压已转换为110V,设备可以使用了!");
}
}
// 客户端(Client)
public class AdapterPatternExample {
public static void main(String[] args) {
// 创建被适配的220V电压
Voltage220V voltage220V = new Voltage220V();
// 创建适配器
Voltage110V adapter = new VoltageAdapter(voltage220V);
// 使用适配器提供的110V电压
adapter.use110V();
}
}
输出结果:
通过适配器转换电压...
提供220V电压
电压已转换为110V,设备可以使用了!
适配器模式的优点:
- 兼容性强:
- 通过适配器可以将已有的类复用到新的环境中。
- 灵活性高:
- 可以对类进行解耦,使原有类和客户端不需要直接交互。
- 符合开闭原则:
- 不需要修改现有的类,而是通过新增适配器类实现功能。
适配器模式的缺点:
- 系统复杂度增加:
- 如果过多地使用适配器,可能会使系统结构复杂化。
- 性能开销:
- 适配器增加了额外的间接层,可能会影响性能。
适配器模式的适用场景:
- 现有的类或方法的接口与目标接口不兼容,但需要将它们集成。
- 需要复用一些现有的类,但它们的接口与当前系统不兼容。
- 想要封装旧系统中的类,并使其与新系统的接口匹配。
适配器模式的常见应用:
- Java IO流中的适配器:
InputStreamReader
将InputStream
转换为Reader
。
- 数据库访问框架:
- JDBC 驱动程序通过适配器实现统一的数据库访问接口。
- UI 框架:
- 将不同的事件处理方法适配到统一的接口中。
通过适配器模式,我们可以轻松解决接口不兼容的问题,实现类的复用和系统的灵活性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型
2020-01-14 java学习第一课