2013-03-23 82 views
3

如果我按照任何数量的例子可以在网络上,我看到了委托模式一个共同的主题浮现:标准委托模式似乎与委托目的赔率

myClass.delegate = self; 

从我读,代表团是假设解耦行为,但允许类之间的交互,但是,只分配一个委托似乎是100%与此行为不一致。

我有一个web开发背景,并且我非常熟悉pub/sub模式,但是我试图包裹头部的是为什么我只允许一个代表(self)能够采取行动无论发生在myClass。这似乎毁了整个代表团的重点。

也许我误解了一些东西,或许这只是最简单的授权形式,但是有人可以解释一下如何静静地分配(以传统意义上)一个类到另一个代表的行为。

奖金:也许是一种允许多个班级对委派进行操作的方法。

回答

4

委托声明对委托类的附加控制。最简单的例子是NSWindowDelegate协议中的windowShouldClose:方法。班级代表有机会主动覆盖关闭NSWindow中的窗口。 如果允许多个代表,可能会有多个代表提供相互冲突的订单,这将是一个不理想的结果。

enter image description here

代表团允许您自定义的行为没有子。因为一个类可以实现许多委托协议,所以它是Objective-C中MVC编程模型的关键部分。 委派允许您创建一个类作为多个其他类的“控制器”。

代理反应式对于类发生了什么,您使用关键值观察的发布/订阅模型。例如,NSOperationQueue有一个可观察的属性operationCount,可以让您对队列中操作数量的更改做出反应。

+1

+1这是我第一次听到“关键值观察”这个短语。非常感谢你的清楚解释。我似乎误解了代表团的根本目的。 – dclowd9901 2013-03-23 18:56:55

1

它解耦行为,意思是委托人根本不需要知道关于委托的任何内容,而不是(可能)响应某个特定的方法。这使得具有委托的类可以在完全不同的代码库/情况下使用而不用更改。当编写将被其他人使用的Framework类时,这尤其适用,这是您在系统框架中看到它的原因之一。

委托的主要用途之一是允许定制对象的行为而不需要继承。以NSWindowDelegate方法-windowWillResize:toSize:为例,其中代表可以返回与建议的尺寸不同的尺寸来实现自定义尺寸调整行为。这个场景如何处理,每个代理都返回不同的值?

当然,有时委托方法只是为了通知委托人已经发生了某些特定的事件。在这些情况下,多个对象希望得到通知确实是合理的。这在Objective-C/Cocoa中通过通知(NSNotification)和Key Value Observing(KVO)提供。在Cocoa中您会发现很多案例,其中委托方法也会发布相应的通知,以防委托人以外的其他对象想要了解它(例如windowWillClose:/NSWindowWillCloseNotification)。

+0

100%。另外一个想法是:我经常认为委托可以替代* subclassing *,你可以用其他语言来改变视图的行为。与子类化相比,委派具有比子类和超类之间通常模糊的接口更清晰的接口(对于委托者和委托)。 – 2013-03-23 18:51:01

+0

是的,这就是我的意思,“代表团的主要用途之一是允许定制...没有子类化”,但我没有解释为什么这是一个好主意。 “常常 - 黑暗”绝对是通过子类定制的一个很好的描述。如果超类改变了行,那么这种自定义也更容易中断,其中委托使得预期的定制点明确并且是API的一部分。 – 2013-03-23 19:06:05