背景
现实生活中,如果我要给苹果手机充电,但是我只有一根安卓充电线,这里我还有一根安卓转苹果的转接线。所以我可以给苹果手机充电,使用安卓线加上转接线就能实现。
那么这里的转接线就充当了适配器的作用。
我们在开发中也会碰到类似的情景,具有某种业务功能的方法已经存在,但是它与当前系统的接口规范不符。如果重新开发方法,成本会很高。这时我们就可以使用适配器模式来解决这个问题。
示意图
如图左,A、B两个组件想结合在一起,需要图右中的C。这个C就是适配器。
什么是适配器模式
“Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。) ”
适配器模式主要有下面几个要素组成:
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
关系图如下:
适配器模式
代码实现
Target
Adaptee
ClassAdapter
测试代码:
代码语言:javascript复制public static void main(String[] args){
System.out.println("类适配器模式测试:");
Target target = new ClassAdapter();
target.request();
}
测试结果如下:
代码语言:javascript复制类适配器模式测试:
适配者中的业务代码被调用!
你看,适配器模式是不是很简单。只需写一个适配的类继承目标类并实现需要适配的接口即可。
关于适配器模式的思考
当我们有现成的组件满足业务需求,但是这个组件与新系统的接口规范不符。我们就可以适配器模式。
适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。