【设计模式】27.结构型模式-适配器(Adapter)
一、描述
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
1.角色
(1)目标类(target):定义Client使用的与特定领域相关的接口。
(2)客户端类(Client):与符合Target接口的对象协同。
(3)需要适配的接口类(Adaptee):定义一个已经存在的接口,这个接口需要适配。
(4)适配器(Adapter):对Adaptee的接口与Target接口进行适配。
2.类图
3.适配器模式分为两类:类适配器和对象适配器。
(1)类适配器:
- 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
- 使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
- 仅仅引入了一个对象,并不需要额外的指针以间接得到apaptee.
(2)对象适配器:
- 允许一个Adapter与多个Adaptee-----即Adaptee本身以及它的所有子类同时工作,Adapter也可以一次给所有的Adaptee添加功能。
- 使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
二、优点
1.解耦性:适配器让两个毫无关联的接口实现客户的功能。
2.提高代码的复用性:适配的两方不需要修改逻辑,只需要专注于自身功能即可。通过适配器,可以让适配类实现客户需求,而不需要修改原有代码。
3.提高系统扩展性:通过适配器适应多种场景。
三、缺点
1.过多使用适配器会使系统变得复杂且不好维护。
四、适用场景
1.当迁移系统时,如果不方便修改对外接口参数和返回时,可以添加适配器,将请求转化为新系统的请求。
五、示例
以"手机充电器将220V转为5V"为例
1.创建220V类
public class PowerSupply220 { public int output() { return 220; } }
2.创建5V接口
public interface PowerSupply5V { int dc5V(); }
3.创建适配器实现5V接口
public class InterfaceAdapter implements PowerSupply5V { private PowerSupply220 powerSupply; public InterfaceAdapter(PowerSupply220 powerSupply) { this.powerSupply = powerSupply; } @Override public int dc5V() { return powerSupply.output() / 44; } }
4.测试
@Slf4j public class InterfaceAdapterTest { public static void main(String[] args) { InterfaceAdapter interfaceAdapter = new InterfaceAdapter(new PowerSupply220()); log.info("output:{}", interfaceAdapter.dc5V()); } }
效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构