对象A 的某个方法让对象 B 帮忙实现,我们看起来却好像是对象 A 实现的。
在 Cocoa 环境中,与其说委托是处理自身不能处理的消息,还不如说它是应用为了添加必要的处理而“增设”的对象。图15-3(a)是非委托的情况,这种情况下会执行默认处理(也可能无法处理)。(b)为委托的情况,这种情况下会与委托对象协同处理或完全由委托对象处理。
委托有很高的可复用性,在作为组件使用的类中十分有效。通过使用委托,可以在不损害原类别的独立性的同时,给软件增加独立的功能。
举例说明如下:
加速度传感器可以使用 UKit 框架的 UIAccelerometer 类。加速度传感器是单体类,也就是只能有一个实例的类型。那么应用中如何感知 iphone 的晃动及倾斜呢?
实际上是创建单个对象,将其注册为 UIAccelerometer 实例的委托。这样,检测到的加速度值作为消息每隔一定时间就传送给委托对象,不需要再询问 UIAccelerometer。应用既可以一直获得加速度值信息,也可以在传感器发生较大变化时获得。这其中的差异在委托侧的程序中实现。
委托可为已有类增加新功能,是一种灵活性较高的获取并利用信息的方式。而且,一个对象并不是只能有一个委托、某些情况下一个对象也可以拥有多个委托。
同样的事件,如果使用继承的话会怎样呢?虽然在某种程度上使用继承也可以实现,但在运行时无法灵活地分配、切换委托,而且一个对象也不能同时拥有多个对象的委托。因此,建议只将默认操作之外的功能在其他类中实现,这样就能写出高独立性的软件。
毋庸置疑,现实中也存在一些建议使用继承的情况。虽然继承和委托必须要区分使用,但委托有很多继承没有的优点。熟练使用委托可以在很多情况下达到事半功倍的效果。
摘自:《Objective-C 编程全解》