0x1、定义
适配器,很好理解,比如手边的电脑电源适配器,它的作用就是将 220V的家用交流电 转换成 20V的直流电,又比如苹果笔记本电脑,只有 雷电接口,如果想用 USB接口的键鼠/网线,需要一个 扩展坞/转接头。
网络异常,图片无法展示
|
将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能在一起工作的类可以一起工作,这就是适配器模式。
简单点说:
两个彼此间没有太大关联的类,想要交互完成某些事情,如果直接去改各自的接口,就显得有些繁琐了。可以加个 中间类,用它来协调两个类间的关系,完成相关业务。
适用场景
- 封装有缺陷的接口设计 (如依赖的外部系统在接口设计方面有缺陷,隔离缺陷,对接口进行二次封装);
- 统一多个类的接口设计 (某功能的实现依赖多个外部系统,接口适配为统一的接口定义,多态复用);
- 替换依赖的外部系统;
- 兼容老版本接口 (要废弃的接口不直接删除,暂时保留标注为的deprecated,并将内部实现逻辑委托为新接口实现);
- 适配不同格式的数据; (如Java中的Arrays.asList()将数组类型数据转换为集合类型);
- 不同接口协议转换;
0x2、类适配器
根据适配器类与适配器类的关系不同,分为 类适配器
与 对象适配器
两种,前者使用 继承
关系 实现,后者使用 组合
关系实现。
写个简单的翻译转换例子~
// 需要适配的接口 public class English { void speakEnglish(String talk) { System.out.println("【英语】" + talk); } } // 目标接口 interface Chinese { void speakChinese(String talk); } // 适配器角色 public class ClassTranslator extends English implements Chinese { @Override public void speakChinese(String talk) { // 可调用父类方法或直接进行重写 super.speakEnglish(talk); System.out.println("假装请求了翻译接口,输出翻译结果:【中文】玛卡巴卡"); } } // 测试用例 public class AdapterTest { public static void main(String[] args) { Chinese translator = new ClassTranslator(); translator.speakChinese("Ma ka ba ka"); } }
运行输出结果如下:
网络异常,图片无法展示
|
UML类图如下:
网络异常,图片无法展示
|
角色如下:
- Target (目标接口) → 客户所期待的接口,目标是接口;
- Adaptee (需要适配的类) → 又称适配者类;
- Adapter (适配器) → 并继承适配者类,实现目标接口,按需重写、调用方法;