适配器模式
基本介绍
1.适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器。
2.适配器模式属于结构型模式
3.主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
类适配器模式介绍
基本介绍:Adater类,通过继承src类,实现dst类接口,完成src->dst的适配。
类适配器模式应用实例
1.应用实例说明
以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的dst(即目标)是SV直流电
2.思路分析图解
3.代码实现
1 2 3 4 5 6 7 8 9 10 | package com.adapter.classadapter; public class Voltage220V { //输出220V的电压 public int output220V(){ int src= 220 ; System.out.println( "电压" + src + "V" ); return src; } } |
1 2 3 4 5 | package com.adapter.classadapter; //5v接口 public interface IVoltage5V { public int output5V(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.adapter.classadapter; /* *适配器类 */ public class VoltageAdapter extends Voltage220V implements IVoltage5V{ @Override public int output5V() { //获取到220V的电压 int srcV = output220V(); int dstV = srcV / 44 ; //转成5V return dstV; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com.adapter.classadapter; public class Phone { //充电 public void charging(IVoltage5V iVoltage5V){ if ( 5 ==iVoltage5V.output5V()){ System.out.println( "电压为5V,可以充电~~" ); } else if ( 5 <iVoltage5V.output5V()){ System.out.println( "电压大于5V,不能充电" ); } else if ( 5 >iVoltage5V.output5V()){ System.out.println( "电压小于5V,不能充电" ); } } } |
1 2 3 4 5 6 7 8 9 | package com.adapter.classadapter; public class Client { public static void main(String[] args) { System.out.println( "=== 类适配器模式 ======" ); Phone phone = new Phone(); phone.charging( new VoltageAdapter()); } } |
运行结果;
1 2 3 | === 类适配器模式 ====== 电压220V 电压为5V,可以充电~~ |
类适配器模式的注意事项
1.java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性。
2.src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
3.由于其继承了src类,所以他可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
对象适配器模式介绍
1.基本思路和类的适配器模式相同,只是将Adapter类做修改,不是继承src类,而是持有src类的实例,已解决兼容性的问题。即:持有src类,实现dst类接口库,完成src->dst的适配
3.根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
3.对象适配器模式是适配器模式常用的一种。
代码实现:
1 2 3 4 5 6 7 8 9 10 | package com.adapter.objectadapter; public class Voltage220V { //输出220V的电压 public int output220V(){ int src= 220 ; System.out.println( "电压" + src + "V" ); return src; } } |
1 2 3 4 5 | package com.adapter.objectadapter; //5v接口 public interface IVoltage5V { public int output5V(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.adapter.objectadapter; /* *适配器类 */ public class VoltageAdapter implements IVoltage5V { private Voltage220V voltage220V; //关联关系-聚合 /** * 通过构造器,传入一个Voltage220V * @param voltage220V */ public VoltageAdapter(Voltage220V voltage220V) { this .voltage220V = voltage220V; } @Override public int output5V() { int dst = 0 ; //对通过构造函数传过来的对象进行判断,是否为空进行校验。 if ( null !=voltage220V){ int src=voltage220V.output220V(); //获取220V 电压 System.out.println( "使用对象适配器,进行适配~~" ); dst = src / 44 ; System.out.println( "适配完成,输出的电压为=" +dst); } return dst; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com.adapter.objectadapter; public class Phone { //充电 public void charging(IVoltage5V iVoltage5V){ if ( 5 ==iVoltage5V.output5V()){ System.out.println( "电压为5V,可以充电~~" ); } else if ( 5 <iVoltage5V.output5V()){ System.out.println( "电压大于5V,不能充电" ); } else if ( 5 >iVoltage5V.output5V()){ System.out.println( "电压小于5V,不能充电" ); } } } |
1 2 3 4 5 6 7 8 9 | package com.adapter.objectadapter; public class Client { public static void main(String[] args) { System.out.println( "=== 对象适配器模式 ======" ); Phone phone = new Phone(); phone.charging( new VoltageAdapter( new Voltage220V())); } } |
运行结果:
1 2 3 4 5 | === 对象适配器模式 ====== 电压220V 使用对象适配器,进行适配~~ 适配完成,输出的电压为= 5 电压为5V,可以充电~~ |
对象适配器模式注意事项和细节总结
1.对象适配器模式和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口(也就是说你可以将目标对象写成类也是可以的)。
2.使用成本更低,更加灵活。
接口适配器模式介绍
1.一些书籍称为:适配器模式或缺省适配器模式。
2.当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并未该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。
3.适用于一个接口不想使用其所有的方法的情况。
注意:匿名内部类的使用
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 | package com.adapter.interfaceadapter; /** * 接口 假设一共有4个方法 */ public interface Interface4 { public void m1(); public void m2(); public void m3(); public void m4(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.adapter.interfaceadapter; public abstract class AbsAdapter implements Interface4{ @Override public void m1() { } @Override public void m2() { } @Override public void m3() { } @Override public void m4() { } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com.adapter.interfaceadapter; public class Client { public static void main(String[] args) { AbsAdapter absAdapter = new AbsAdapter() { //只需要覆盖我们需要使用的接口中的方法 @Override public void m1() { System.out.println( "使用了m1的方法" ); } }; absAdapter.m1(); } } |
运行结果:
1 | 使用了m1的方法 |
适配器模式总结
1.三种命名方式,是根据src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的。
2.类适配器:以类给到,在Adapter里,就是将src当做类,继承。
对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有。
接口适配器:以接口归到,在Adapter里,架构src作为一个接口,实现
3.Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。
4.实际开发中,实现起来不拘泥于我们讲解的三种经典形式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY