适配器模式(Adapter Pattern)
一、简述
适配器模式指将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如说电脑一个显示屏不够用,再加一个。新加的显示屏接头不能和电脑适配,需要转换器接入。这就是适配器模式的一个体现。
适配器模式在 Java 中十分常用。这种模式适用于以下场景:想使用一个已存在的类,但是该类不符合接口需求;或者需要创建一个可重用的类,适配没有提供合适接口的其它类。如:
java.io.InputStreamReader(InputStream) (返回一个Reader)
java.io.OutputStreamWriter(OutputStream) (返回一个Writer)
适配器模式常见的有三种:
1️⃣类适配器模式
️2️⃣对象适配器模式
3️⃣接口适配器模式
这三种的思想都是一样的,只不过要适配的内容不一样而已。
二、类适配器模式
1️⃣Target 目标角色
该角色定义把其他类转换为何种接口,也就是期望的接口。
️2️⃣Adaptee 源角色
想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色。
3️⃣Adapter 适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色转换为目标角色,怎么转换?通过继承或是类关联的方式。
三、适配器模式的特点
1️⃣更好的复用性
系统需要使用现有的类,因此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
2️⃣更好的拓展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然的拓展系统的功能。
3️⃣有动机修改一个已经投产中的接口时,适配器模式可能是最适合的模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,怎么办?使用适配器模式。
4️⃣详细设计阶段不要考虑使用适配器模式,使用主要场景为扩展应用中。
5️⃣适配器模式的缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部都被适配成了B接口的实现。一个系统如果太多的出现这种情况,无异于异常灾难。因此如果不是很有必要,可以不是用适配器,而是直接对系统进行重构。
四、对象适配器和类适配器的区别
类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。实际项目中对象适配器使用到的场景相对比较多。