iOS 探讨之 代理模式

来源:互联网 发布:注册码破解软件下载 编辑:程序博客网 时间:2024/04/30 09:22
评判一个iOSer能否独挡一面,首先的标准就是其需能叙述清楚代理模式及模式中谁是谁的代理问题。

探讨
95年GoF(四人帮) 出版的《设计模式》一书中介绍的23中基本设计模式中就包含代理模式,我们首先看一下书中的观点:


因上文是翻译过来的,且当时其实针对Java的,理解起来还是有一定难度。

iOS 设计模式中经常出现的 delegate 在中文翻译成“代理”,故在开发者人群中也就随之传开了。

一般代码中,出现的场景是:
UITableView 实例化一个对象B, B负责列表渲染等工作,但是自己有没有过多的精力去处理采集数据、展示样式等问题。
对象A  (UIViewController 视图控制器实例化的一个对象) 可以处理这些问题,
这时通常我们声明
     B.delegate = A;
对象A 实现双方协议好的方法(遵循UITableViewDelegate)(如:1. 多少数据 2. 每行显示样式 3. 点击后触发事件)

代码世界是现实世界的抽象,因此我们先从现实世界中阐释
上述可见的对象A、对象B 在不同的场景下称呼不太一样,
如果只考虑A、B之间的关系
那么就是委托人(B) 、受托人(A)的关系。
委托人: 事务的产生者,是指委托他人为自己办理事务的人 —> 对应B
受托人(代理人):事务的接收者,是接受委托人的委托代理处理相关事务的人 —>对应 A
委托规范: 是委托人和受托人双方之间的关系 —> 对应 Protocol

根据之前的现实场景,从代码世界来解释:
只从对象A、对象B的之间进行考虑:
对象B  委托 对象A 进行列表视图的数据采集、样式制作等工作,
A与B之间的委托协议是:
对象B 可以找得到对象A
对象A 负责提供数据,及样式

故B需要持有A的联系方式(即B.delegate = A; )
在约定的时间,通过约定的方式(协议中的方法) (B.delegate performSelect) 来获取对应的资源,或通知对象做什么事情。

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。
委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。


总结
下面就以网络上流传的一段思考方式进行总结
1 先搞清楚谁是谁的代理 (delegate)
翻译: 谁是委托人(产生任务需求)、谁是受托人(处理任务需求)

2 定义代理协议 协议名称 命名规范 代理协议+Delegate
翻译: 委托人、受托人之间委托协议的名称

3 定义代理方法
翻译: 委托人、受托人之间商量的方法(委托人需要提供什么、委托人以什么渠道了解事件进度)  
要求: 
- 代理方法一般都定义为@optional
- 代理方法名都以控件名开头
- 代理方法至少要将控件本身传递出去

4 设置代理 B.delegate = A;
翻译: 委托人持有受托人的联系方式,在必要的时候进行联系。

5 代理对象遵守协议
翻译: 受托人在委托协议书上签字。

6 代理对象实现协议里面该实现的方法
翻译: 受委托人实现委托协议书上必要的事情

7 恰当的时刻调⽤代理对象(delegate)的实现的代理方法获知代理对象准备的东西
翻译: 委托人在恰当的时候按照约定好的方式获取受托人实现的事情信息
要求:
- 在调⽤之前判断代理是否实现了该代理⽅方法

资料
- 代理与委托 http://iask.sina.com.cn/b/2236865.html
- 设计模式 http://baike.baidu.com/item/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/19696449#viewPageContent
- 代理模式 http://www.cocoachina.com/ios/20160317/15696.html