生活中类似适配器模式的比较简单的例子就是电源适配器,或者转接器,下面简要描述一个常见的例子:
我有一条苹果充电线,一开始我用的是15款的笔记本电脑,数据线可以直接和电脑连接,我想要通过电脑整理手机中的文件,直接就可以连接电脑。过了一段时间,我换了17新款电脑,发现数据线无法连接到电脑上了,这个时候我就需要一个转接头或者转换器,那么这个转换器就相当于适配器,是要将我的电脑插头和我的数据线插头给适配起来,使它们能够正常工作。
适配器的原理也是类似,下面我们认识一下适配器的定义:
1.什么是适配器模式
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
划重点:主要是为了解决接口不兼容而生,也就是说以前已经存在了一部分,现在有另外一部分需要融入进去,就需要转换器(适配器)
用一张UML图可以很好地说明适配器模式
这个是典型的对象适配器方法,稍后会讲解类适配器方法
从图中可以分析出,需要被适配的对象Adaptee原本拥有了一个方法existMethod,现在要将Adaptee中已存在的方法适配成Target中的方法,那么需要在Adapter中进行操作,稍后会给出源码示例:
- Client:客户端,调用自己需要的接口Target
- Target:定义客户端需要的特定领域相关的接口
- Adaptee:已经存在的接口,通常可以满足用户的功能要求,但是接口与客户端要求的不一致,需要被适配
- Adapter:适配器,将Adaptee适配成为Client需要的Target
2.对象适配器
UML结构图如上图所示,下面具体给出实现
目标接口,也就是客户端需要的接口
原有接口,即被适配对象
对象适配器
客户端调用
从这可以看出来,对象适配器中,适配器需要拥有被适配者
类适配器
严格来说,类适配器是要实现如图所示,需要同时继承Target,Adaptee,但是OC是没有多继承的,所以需要借助接口和继承的形式实现,如下图:
下面我直接展示类适配器的实现方法,Target和Adaptee和对象适配器一样:
适配器模式的优缺点
优点
-
更好的复用性 如果已经有的功能,只是接口不兼容,通过此模式能很好地实现复用
-
更好的扩展性 适配器中可以新增新的功能
缺点
- 过多使用适配器,使得系统非常凌乱,不容易整体把握
适配器的本质是转换匹配,复用功能,简而言之就是通过转换调用已有的实现,把已有的实现匹配成需要的接口
适配器使用的场景:
如果想要使用一个已经存在的类,但是这个存在的类的接口不符合需求
想要创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,可以使用适配器模式,需要什么就适配什么
想要使用一些已经存在的子类,但是不可能对每一个子类都适配,所以可以选择对象适配器,直接适配这些子类的父类