3

如果我遵循网络上提供的许多示例中的任何一个,我会看到委托模式出现了一个共同的主题:

myClass.delegate = self;

从我读到的,委托应该解耦行为,但允许类之间的交互,但是,只分配一个委托似乎与这种行为 100% 不一致。

我有 web 开发背景,而且我非常熟悉 pub/sub 模式,但我试图理解的是为什么我只允许单个委托 ( self) 能够对myClass. 这似乎会破坏授权的全部意义。

也许我误解了某些东西,或者这只是最简单的委托形式,但是有人可以解释一下如何将一个类静态分配(在经典意义上)另一个类的委托以任何有意义的方式解耦行为。

奖励:也许是一种允许多个类对一个委托采取行动的方法。

4

2 回答 2

4

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

在此处输入图像描述

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

为了对类发生的事情做出反应,您使用键值观察的发布/订阅模型。例如,NSOperationQueue有一个可观察的属性operationCount,让您对队列中操作数量的变化做出反应。

于 2013-03-23T18:41:20.073 回答
1

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

委托的主要用途之一是允许自定义对象的行为而无需子类化。以NSWindowDelegate方法为例-windowWillResize:toSize:,其中委托可以返回与建议的尺寸不同的尺寸来实现自定义尺寸行为。如果多个委托返回不同的值,如何处理这种情况?

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

于 2013-03-23T18:46:05.957 回答