Java适配器模式通过继承(类适配器)或组合(对象适配器)将被适配类接口转换为目标接口,实现不兼容类的协作;类适配器耦合高但简洁,对象适配器更灵活、符合合成复用原则,推荐优先使用。

Java中适配器模式通过继承或组合,把一个已有类的接口“翻译”成目标接口,让不兼容的类能协作。关键不是改原类,而是加一层中间转换——就像USB转Type-C转接头,插头没变,但能插进新接口。
用继承实现:类适配器(Class Adapter)
适配器类同时继承被适配类 + 实现目标接口。Java虽不支持多继承,但可以继承一个类、实现多个接口,所以这种写法完全合法。
- 被适配类提供实际功能(比如
Usb.useUsb()),适配器用super调用它 - 目标接口定义期望行为(比如
Typec.useTypec()),适配器在实现方法里桥接过去 - 适合被适配类方法不多、且与目标接口逻辑接近的场景;但耦合度高,一旦被适配类修改,适配器可能要跟着动
用组合实现:对象适配器(Object Adapter)
适配器类实现目标接口,内部持有被适配对象的引用(通过构造器传入),所有目标方法都委托给该对象执行。
- 被适配对象作为成员变量(如
private Usb plug),适配器只调用它的公开方法 - 更灵活、易扩展,符合“合成复用原则”——优先用组合,而非继承
- 支持运行时切换被适配对象,也便于单元测试(可注入模拟对象)
怎么选?看实际约束
如果被适配类是final,或你无法继承它(比如它是第三方库里的类),只能用组合;如果只是简单封装、且想少写一行字段声明,继承写起来更紧凑。但绝大多数情况下,推荐对象适配器——它不破坏封装,也更容易应对后续变化。
立即学习“Java免费学习笔记(深入)”;
注意别和代理模式混淆
适配器解决的是接口不匹配,目标是让旧类能在新环境跑起来;代理解决的是增强原有行为,接口完全一致,只是加了日志、校验、缓存等横切逻辑。两者结构相似,但意图不同——适配器是“翻译”,代理是“包装”。


















