2013-03-23 122 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