结构型模式之Adapter模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口。
在JDK中的体现
把一个接口或类变成另外一种。
java.util.Arrays#asList()
javax.swing.JTable(TableModel)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
参与角色
目标角色(Target): 定义Client使用的与特定领域相关的接口,即期待得到的接口。
客户角色(Client):与符合Target接口的对象协同。
被适配橘色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要被适配。
适配器角色(Adapte):适配器模式的核心。
它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口,对Adaptee的接口与Target接口进行适配.
适配器模式实例
1 2 3 4 5 6 7 8 | /** * 所期待得到的接口 */ public interface Target { /**类似中国的电源接口*/ public void expectMethod(); } |
1 2 3 4 5 6 7 8 9 10 | /** * 需要被适配的接口,类似国外的电源接口 */ public class Adaptee { /**德国电源插口*/ public void notMatchMethod(){ System.out.println( "这是待适配的德国电源插口__" ); } } |
1.类适配器模式
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 类适配器模式 * 适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。 */ public class Adapter1 extends Adaptee implements Target{ @Override public void expectMethod() { //可以调用Adaptee的方法做适当修改 notMatchMethod(); System.out.println( "在适配器中实现期待的方法" ); } } |
Adapter与Adaptee是继承关系
用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
仅仅引入一个对象,并不需要额外的指针以间接取得adaptee
2.对象适配器模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * 对象适配器模式 * 通过对象的委托实现 */ public class Adapter2 { private Adaptee adaptee; public Adapter2(Adaptee adaptee){ this .adaptee=adaptee; } public void notMatchMethod(){ // this .adaptee.notMatchMethod(); } public void expectMethod(){ //需要的接口 System.out.println( "在适配器中实现期待的方法" ); } } |
Adapter与Adaptee是委托关系
允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
使用重定义Adaptee的行为比较困难
无论哪种适配器,宗旨都是:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
即在不改变原有系统的基础上,提供新的接口服务。
适用场景
使用一个已经存在的类,而它的接口不符合你的需求,
创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
本文来自博客园,作者:邴越,转载请注明原文链接:https://www.cnblogs.com/binyue/p/4304679.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南