第23条:通过委托与数据源协议进行对象间通信
Posted CHM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第23条:通过委托与数据源协议进行对象间通信相关的知识,希望对你有一定的参考价值。
第4章:协议与分类
Objective-C 语言有一项特性叫做“协议”(protocol),它与 Jave 的 “接口”(interface)类似。Objective-C 不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里面。协议最为常见的用途是实现委托模式,不过也有其他用法。理解并善用协议可令代码变得更易维护,因为协议这种方式能很好的描述接口。
“分类”(category)也是 Objective-C 的一项重要语言特性。利用分类机制,我们无须继承子类即可直接为当前类添加方法,而在其他编程语言中,则需通过继承子类来实现。由于 Objective-C 运行期系统是高度动态的,所以才能支持这一特性,然而,其中隐藏者一些陷阱,因此在使用分类之前,应该先理解它。
对象之间经常需要相互通信,而通信方式有很多种。Objective-C 开发者广泛使用一种名叫“委托模式”(Delegate pattern)的编程设计模式来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需遵从此接口,以便成为其 “委托对象”(delegate)。而这 “另一个对象” 则可以给其委托对回传一些信息,也可以在发生相关事件时通知委托对象。
此模式可以将数据与业务逻辑解藕。比方说,用户界面里有个显示一系列数据所用的视图,那么,此视图只应包含显示数据所需的逻辑代码,而不应决定要显示何种数据以及数据之间如何交互等问题。视图对象的属性中,可以包含负责数据与事件处理的对象。这两种对象分别称为“数据源”(data source)与 “委托”(delegate)。
在 Objective-C 中,一般通过 “协议” 这项语言特性来实现此模式,整个 Cocoa 系统框架都是这么做的。如果你的代码也这样做。如果你的代码也这样写,那么就能和系统框架很好地融合在一起了。
为演示此模式,我们举个例子,假设要编写一个从网上获取数据的类。此类也许要从远程服务器的某个资源里获取数据。那个远程服务器可能过很长时间才会应答,而在获取数据的过程中阻塞应用程序则是一种非常糟糕的做法。于是,在这种情况下,我们通常会使用委托模式:获取网络数据的类含有一个“委托对象”,在获取完数据之后,它会回调这个委托对象。图演示了此概念:EOCDataModel 对象就是 EOCNetworkFetcher 的委托对象。EOCDataModel 请求 EOCNetworkFetcher “以异步方式执行一项任务”(perform a task asynchronously),而 EOCNetworkFetcher 在执行完这项任务之后,就会通知其委托对象,也就是 EOCDataModel。
利用协议机制,很容易就能以 Objective-C 代码实现此模式。图演示的这种情况下,协议可以这样来定义:
以上是关于第23条:通过委托与数据源协议进行对象间通信的主要内容,如果未能解决你的问题,请参考以下文章