> For the complete documentation index, see [llms.txt](https://wilden-chen.gitbook.io/swift-design-patterns/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wilden-chen.gitbook.io/swift-design-patterns/decorator/decorator-delegation.md).

# 委派

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

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

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

![](https://2481295995-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lejh-llXQZynxNlmsNC%2Fuploads%2Fgit-blob-7a7613412cb1756a08338059727d0e3d63779586%2Fdecorator3.png?alt=media)

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

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

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