2016年系统的学习了iOS的设计模式,在整理文档时发现有几篇总结因为当时事情耽误没有发出,近几天会逐渐发布,借此在复习一下iOS的设计模式。
相信在以后的工作中会用到。下面补上适配器模式的内容

1.介绍
适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.分类
  适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用,另外,OC中也不支持多重继承。对象适配器采用“对象组合”的方式,更符合松耦合规范。
结构图
  有两种实现适配器模式的方式。第一种是通过继承来适配两个接口,这称为类适配器。

(1)类适配器

在Gof介绍设计模式的书中,类适配器是通过多重继承来实现的。OC中没有多继承,但在OC中,类可以实现协议,同时又继承父类,达到C++多继承的效果。要在OC中实现类适配器,首先需要有定义了客户端要使用的一套行为的协议,然后要用具体的适配器类来实现这个协议。适配器类同时也要继承被适配者。类适配器结构图如下所示:

IOS端是如何适配的 ios 适配器_IOS端是如何适配的

  从图中可以看到,Adapter是一个Target类型,同时也是Adaptee类型。它重载了Target的request方法,没有重载Adaptee中的specificRequest方法,而是在Adapter的request方法的实现中,调用父类的specificRequest方法。只有当Target是协议而不是类时,类适配器才能够用OC来实现,因为OC中是没有多重继承的。

(2)对象适配器

实现适配器模式的第二种方式称为对象适配器。与类适配器不同,对象适配器不继承被适配者,而是组合了一个对它的引用。对象适配器结构图如下所示:

IOS端是如何适配的 ios 适配器_适配器模式_02

从两个结构图可以看到,Target和Adapter的关系相同,Adapter和Adaptee之间的关系,由继承变成了关联。这种关系下,Adapter需要保持一个对Adaptee的引用。在request方法中,Adapter发送[_adaptee specificRequest]消息给Adaptee,以完成客户端的请求。

3.iOS的框架中的适配器

  OC中常用的委托(Delegate)模式属于对象适配器。以常用的UITableViewDelegate为例,我这里先画出它的结构图,如下所示:

IOS端是如何适配的 ios 适配器_IOS端是如何适配的_03

  UITableView(对象适配器中的Client角色)处理选中行事件时,消息会传递给UITableViewDelegate(对象适配器中Target角色),然后调用MyViewController(对象适配器中Adapter角色)里面的- (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath方法来进行处理,在MyViewController的这个方法中,我们会调用其他对象(比如说我们可能会调用详情DetailViewController对象来跳转到详情页面)来处理该消息。

3.使用场景
  在以下各种情况下可以考虑使用适配器模式:
• 需要使用一个已经存在的类,而它的接口不符合新环境的规范。
• 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
这是Demo的代码:https://github.com/onebutterflyW/DesignModel