结构型:适配器模式
目录
1、核心思想
2、实现方式
2.1 类适配器(继承实现,专属适配器)
2.1.1 模式结构
2.1.2 实现案例
2.2 对象适配器(组合实现,通用适配器)
2.2.1 模式结构
2.2.2 实现案例
3、优缺点分析
4、适用场景
1、核心思想
目的:解决接口不兼容问题,通过接口转换的方式,使原本无法协同工作的类能够一起工作,达到解耦效果。
概念:当一个对象或类的接口不能匹配用户所期待的接口时,适配器就充当中间转换的角色,以达到兼容用户接口的目的,同时适配器也实现了客户端与接口的解耦,提高了组件的可复用性。
举例:
1> 跨语言沟通:必须找个会两种语言的翻译,将接口转换才能使沟通进行下去,我们将翻译这个角色称为适配器
2> 电源适配器:将220V电压转换为手机所需的5V
3> USB转Type-C转换器:连接不同接口的设备
2、实现方式
2.1 类适配器(继承实现,专属适配器)
2.1.1 模式结构
结构:适配器继承被适配者(Adaptee)并实现目标接口(Target)
特点:直接复用被适配者的方法,但受限于单继承
三个核心角色:
- Target(目标接口):客户端要使用的目标接口标准
- Adaptee(被适配者):被适配者的类实现,目前不能兼容目标接口的问题类
- Adapter(适配器):继承自被适配者类且实现了目标接口,负责适配(转换)被适配者的接口specificRequest()为目标接口request()
2.1.2 实现案例
// 目标接口(Target)
interface USB {void connect();
}// 被适配者(Adaptee)
class TypeC {public void typeCConnect() {System.out.println("Type-C connected.");}
}// 类适配器(继承TypeC,实现USB)
class Adapter extends TypeC implements USB {@Overridepublic void connect() {typeCConnect(); // 调用父类方法}
}// 客户端
class Client {public static void main(String[] args) {TypeC typec = new Adapter();typec.connect();}
}
2.2 对象适配器(组合实现,通用适配器)
2.2.1 模式结构
结构:适配器持有被适配者的实例,通过组合实现接口转换。
特点:更灵活,支持多个被适配者,符合“合成复用原则”。
三个核心角色:
- Target(目标接口):客户端要使用的目标接口标准
- Adaptee(被适配者):被适配者的接口标准,目前不能兼容目标接口的问题接口,可以有多种实现类
- Adapter(适配器):实现了目标接口,负责适配(转换)被适配者的接口specificRequest()为目标接口request()
2.2.2 实现案例
// 目标接口(Target)
interface USB {void connect();
}// 被适配者(Adaptee)
interface TypeC {void typeCConnect();
}// 适配器(Adapter)
class Adapter implements USB {private TypeC typeC;public Adapter(TypeC typeC) {this.typeC = typeC;}@Overridepublic void connect() {typeC.typeCConnect(); // 调用被适配对象的方法}
}// 客户端
class Client {public static void main(String[] args) {TypeC typec = new TypeCImpl();//TypeC的实现类USB usb = new Adapter(typec);usb.connect();}
}
3、优缺点分析
优点 | 缺点 |
---|---|
提高代码复用性(无需修改原有代码) | 增加代码复杂度(需新增适配器类) |
灵活支持多适配者(对象适配器) | 过度使用可能导致系统结构混乱 |
符合开闭原则(通过扩展而非修改) |
4、适用场景
-
整合第三方库
-
当需要引入外部库但接口与现有系统不匹配时,通过适配器封装其接口。
-
-
系统升级过渡
-
新旧模块共存时,用适配器让旧代码兼容新接口,避免大规模重构。
-
-
统一多个类的接口
-
例如,系统需要支持多种日志框架(如Log4j、SLF4J),通过适配器统一日志接口。
-
-
框架中的典型案例
-
Java I/O:
InputStreamReader
适配字节流到字符流。 -
Android RecyclerView:
Adapter
将数据绑定到列表视图。
-