适配器模式:将复用类的接口转换成客户端希望的接口。(本质上就是复用的类的接口不能满足当前项目的需要,Adapter 模式使得原本由于接口不兼容而不能一起工作的复用类与现有项目兼容)
适用场景:1.已经存在的类的接口不符合我们的需求;
2.创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3.在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
适配器模式分为类适配器和对象适配器两种实现方式。
1.类适配器
要在OC中实现类适配器,首先需要有定义了客户端要使用的一套行为的协议,然后要用具体的适配器类来实现这个协议。适配器类同时也要继承被适配者。类适配器结构图如下所示:从图中可以看到,Adapter是一个Target类型,同时也是Adaptee类型。它重载了Target的request方法,没有重载Adaptee中的specificRequest方法,而是在Adapter的request方法的实现中,调用父类的specificRequest方法。只有当Target是协议而不是类时,类适配器才能够用OC来实现,因为OC中是没有多重继承的。
2.对象适配器
与类适配器不同,对象适配器不继承被适配者,而是组合了一个对它的引用。对象适配器结构图如下所示:从两个结构图可以看到,Target和Adapter的关系相同,Adapter和Adaptee之间的关系,由继承变成了关联。这种关系下,Adapter需要保持一个对Adaptee的引用。在request方法中,Adapter发送[_adaptee specificRequest]消息给Adaptee,以完成客户端的请求。
小结
适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用,另外,OC中也不支持多重继承。对象适配器采用“对象组合”的方式,更符合松耦合规范。
在以下各种情况下可以考虑使用适配器模式:
需要使用一个已经存在的类,而它的接口不符合新环境的规范。
想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
代码