设计模式中的"万能转换器"------适配器模式
- 一、核心逻辑
- [二、类适配器 vs 对象适配器](#二、类适配器 vs 对象适配器)
- 三、应用场景
- 四、优缺点
- 五、适配器模式的本质

你用过Type-C转HDMI的转换器吗?它的作用很简单:让Type-C接口的电脑能连接HDMI接口的显示器。适配器模式就是软件世界的"转换器",它能将两个不兼容的接口(比如数据格式、协议、硬件规格)连接起来,让它们无缝协作。
一、核心逻辑
适配器模式的核心是中间商思维:不改变原有代码,而是增加一个中间层(适配器)来协调矛盾。它的三个关键角色:
- 目标接口(Target):用户需要的接口(如显示器的HDMI接口)。
- 适配者类(Adaptee):已存在的、功能完善但接口不兼容的类(如电脑的Type-C接口)。
- 适配器类(Adapter):将适配者的功能"翻译"为目标接口(如Type-C转HDMI转换器)。
举个栗子:
- 显示器(目标接口):需要HDMI信号输入。
- 笔记本电脑(适配者):只能输出Type-C信号。
- 转换器(适配器):将Type-C信号转换为HDMI格式。
二、类适配器 vs 对象适配器
类适配器 | 对象适配器 | |
---|---|---|
实现方式 | 继承被适配类(如extends TypeCDevice ) |
组合被适配对象(如private TypeCDevice ) |
灵活性 | 仅支持单一被适配类 | 支持多种设备(如Type-C/USB-A/DP接口) |
代码耦合度 | 高(需继承具体类) | 低(仅依赖接口) |
适用场景 | 专用转换器(如固定品牌设备) | 多功能转换坞(需兼容多种协议) |
类适配器(继承实现)
场景:专用Type-C转HDMI线(适配关系固定)
java
// 目标接口:HDMI输出协议
interface HDMI {
void sendHDMISignal();
}
// 被适配者:Type-C接口的笔记本
class TypeCDevice {
void sendTypeCSignal() {
System.out.println("发送Type-C数字信号");
}
}
// 类适配器(继承TypeCDevice,实现HDMI接口)
class TypeCToHDMIAdapter extends TypeCDevice implements HDMI {
@Override
public void sendHDMISignal() {
super.sendTypeCSignal(); // 调用父类方法
System.out.println("类适配器:Type-C信号 → HDMI信号转换");
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
HDMI adapter = new TypeCToHDMIAdapter();
adapter.sendHDMISignal();
}
}
输出结果:
java
发送Type-C数字信号
类适配器:Type-C信号 → HDMI信号转换
特点:
- 适配器直接继承被适配者(TypeCDevice)
- 代码耦合度高,无法动态更换适配对象
对象适配器(组合实现)
场景:多功能转换坞(支持Type-C/USB-A转HDMI)
java
// 目标接口:同上HDMI接口
// 对象适配器(实现HDMI接口,持有TypeCDevice实例)
class UniversalHDMIAdapter implements HDMI {
private TypeCDevice typeCDevice;
UniversalHDMIAdapter(TypeCDevice device) {
this.typeCDevice = device;
}
@Override
public void sendHDMISignal() {
typeCDevice.sendTypeCSignal();
System.out.println("对象适配器:动态转换信号 → HDMI");
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
TypeCDevice macbook = new TypeCDevice();
HDMI adapter = new UniversalHDMIAdapter(macbook);
adapter.sendHDMISignal();
}
}
输出结果:
java
发送Type-C数字信号
对象适配器:动态转换信号 → HDMI
特点:
- 适配器通过组合持有被适配者对象
- 可动态适配不同设备(如同时支持Type-C和USB-A输入)
三、应用场景
- 硬件接口转换:Type-C转网口、USB转串口。
- 数据格式兼容:JSON转XML、旧版API对接新版系统。
- 协议适配:蓝牙设备连接不同操作系统的手机。
四、优缺点
- 优点:
- 复用性:老旧设备无需改造即可接入新系统。
- 灵活性:一个适配器可支持多场景(如三合一充电线)。
- 缺点:
- 过度使用会臃肿:就像包里的各种转换器,太多反而难以管理。
五、适配器模式的本质
- 核心价值:通过中间层转换接口冲突,符合开放-封闭原则(不修改原有代码)
- 硬件映射 :
- 类适配器 → 焊接式固定转换线(如苹果官方Type-C转HDMI线)
- 对象适配器 → 第三方多功能扩展坞(支持热插拔)
- 开发启示:优先使用对象适配器,避免Java单继承的限制
通过HDMI场景的深入解析可见,适配器模式是接口冲突的终极解决方案。无论是代码中的协议转换,还是你桌上那根"救命"的Type-C转HDMI线,都在默默践行这一设计哲学。