设计模式10 - 设计模式 - 适配器设计模式(高频-结构型)
一、定义
适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
代理模式、装饰器模式和适配器模式区别
三者在实现上都大相径庭,但是,区别是:
代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问、附加追踪等,而非加强本身的功能,这是它跟装饰器模式最大的不同。
装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。
二、实现方式
适配器模式中的角色有:
1、目标角色(target):这是客户锁期待的接口。目标可以是具体的或抽象的类,也可以是接口
2、原始角色(adaptee):已有接口/类,但是和客户器期待的接口不同。
3、适配器角色(adapter):将已有接口转换成目标接口。
-
类适配器:通过继承适配者 + 实现目标接口 来实现适配器功能。
-
对象适配器:通过组合适配者(适配者对象引入) + 实现目标接口 来实现适配器功能
类适配器模式(class adapter pattern):
由于适配器adapter类是适配者adaptee类的子类,因此可以在适配器类中置换一些适配者的方法,即Override(重写),使得适配器的灵活性更强。
对象适配器模式(object adapter pattern):
一个对象适配器可以把多个不同的适配者adaptee适配到一个目标,也就是说,同一个适配器可以将适配者类和它的子类都适配到目标接口。
场景: 本身有220V输出电压,现在要新增5V输出电压。
1.1、原始角色
/** * 原始类 */ public class Adaptee { public int methodBy220() { System.out.println("电源输出电压:220V"); return 220; } }
1.2、目标角色
1 2 public interface ITarget { 3 public int method5(); 4 }
1.3、适配器角色 - 类适配器模式
1 public class Adapter extends Adaptee implements ITarget { 2 @Override 3 public int method5() { 4 int output = super.methodBy220(); 5 System.out.println("电源适配器开始工作,此时输出电压是:" + output); 6 output = output/44; 7 System.out.println("电源适配器工作完成,此时输出电压是:" + output); 8 return output; 9 } 10 }
1.4、适配器角色 - 对象适配器模式
1 public class Adapter implements PowerTarget{ 2 // 适配者角色 3 private Adaptee adaptee; 4 5 public Adapter(Adaptee adaptee) { 6 this.adaptee = adaptee; 7 } 8 9 @Override 10 public int method5() { 11 int output = adaptee.methodBy220(); 12 System.out.println("电源适配器开始工作,此时输出电压是:" + output); 13 output = output/44; 14 System.out.println("电源适配器工作完成,此时输出电压是:" + output); 15 return output; 16 } 17 18 }
结果:
public static void main(String[] args) { Adapter adapter = new Adapter(); adapter.method5(); } 或者 public static void main(String[] args) { Adapter adapter = new Adapter(new Adaptee); adapter.method5(); } 电源输出电压:220V 电源适配器开始工作,此时输出电压是:220 电源适配器工作完成,此时输出电压是:5
三、使用场景-待补充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)