委派

裝飾者模式的另一種實現方案是委派。在這種機制下,一個物件可以和另一個物件相關聯。比如你在用 UITableView ,你必須實現 tableView(_:numberOfRowsInSection:) 這個委派方法。

你不應該指望 UITableView 知道你有多少數據,這是個應用層該解決的問題。所以,數據相關的計算應該通過 UITableView 的委派來解決。這樣可以讓 UITableView 和數據層分別獨立。視圖層就負責顯示數據,你遞過來什麼我就顯示什麼。

下面這張圖很好的解釋了 UITableView 的工作過程:

UITableView 的工作僅僅是展示數據,但是最終它需要知道自己要展示那些數據,這時就可以向它的委託詢問。在 objc 的委託模式里,一個類可以通過協議來聲明可選或者必須的方法。

看起來似乎繼承然後重寫必須的方法來的更簡單一點。但是考慮一下這個問題:繼承的結果必定是一個獨立的類,如果你想讓某個對象成為多個對象的委託,那麼子類這招就行不通了。

注意:委派模式十分重要, Apple 提供的 API 裡面,基本上沒有事件這種東西存在,所以在 UIKit 中大量使用了委派模式來處理原本其他語言有支援的事件,基本上隨處可見。

Last updated