Objective c 标准的委托模式似乎与委托目的不符

Objective c 标准的委托模式似乎与委托目的不符,objective-c,design-patterns,delegates,Objective C,Design Patterns,Delegates,如果我遵循web上提供的许多示例中的任何一个,我会看到委托模式出现了一个共同的主题: myClass.delegate = self; 从我所读到的内容来看,委托应该是解耦行为,但允许类之间的交互,然而,仅分配一个委托似乎与此行为100%不一致 我有web开发背景,对pub/sub模式非常熟悉,但我想说的是,为什么我只允许一个代理(self)对myClass中发生的任何事情进行操作。这似乎会破坏整个授权的意义 也许我误解了什么,或者这只是最简单的委托形式,但是有人能解释一下静态地(在经典意义上

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

myClass.delegate = self;
从我所读到的内容来看,委托应该是解耦行为,但允许类之间的交互,然而,仅分配一个委托似乎与此行为100%不一致

我有web开发背景,对pub/sub模式非常熟悉,但我想说的是,为什么我只允许一个代理(
self
)对
myClass
中发生的任何事情进行操作。这似乎会破坏整个授权的意义

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


额外好处:可能是一种允许多个类对一个委托进行操作的方法。

委托对委托的类进行额外控制。最简单的示例是NSWindowDelegate协议中的
windowShouldClose:
方法。类委托有机会主动地覆盖关闭NSWindow中的窗口如果允许多个委托,则多个委托可能会提供相互冲突的订单,这将是一个不理想的结果。

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


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

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

委托的主要用途之一是允许自定义对象的行为,而无需子类化。以
NSWindowDelegate
方法为例,在该方法中,委托可以返回与建议大小不同的大小,以实现自定义大小调整行为。当多个委托各自返回不同的值时,如何处理此场景


当然,有时委托方法仅仅是为了通知委托某个特定事件已经发生。在这些情况下,需要通知多个对象确实是合理的。这在Objective-C/Cocoa中由通知()和(KVO)提供。在Cocoa中,您会发现很多情况下,委托方法也会在委托想要了解它的情况对象(例如/NSWindowWillCloseNotification)中发布相应的通知。

100%。还有一个想法:我经常认为委托是一种替代方法,可以替代您在其他语言中进行的子类化,例如,改变视图的行为。与子类化相比,委托有一个更干净的接口(对于委托人和委托人来说),而不是子类和超类之间经常模糊的接口。是的,这就是我所说的“委托的主要用途之一是允许定制…而不需要子类化”,但我没有解释为什么这是个好主意。“常常模糊不清”绝对是通过子类化定制的一个很好的描述。如果超类在一行中发生更改,那么这种定制也更容易中断,因为委托使预定的定制点显式化,并且成为API的一部分。+1这是我第一次听到“键值观察”这个短语。非常感谢你的解释。我似乎误解了授权的根本目的。