# 設計模式之王 - MVC

![](/files/-Lejh2D4SSCzVtNVFgtw)

`Model-View-Controller` (縮寫 MVC ) 是 Cocoa 框架的一部分，並且毋庸置疑是最常用的設計模式之一。它可以幫你把物件根據職責進行劃分和歸類。

作為劃分依據的三個基本職責是：

* 模型層 (Model)：

  存儲數據並且定義如何操作這些數據。在我們的例子中，就是 `PhotoVO` 類別。
* 視圖層 (View) ：

  負責模型層的顯示，並且負責用戶的互動，一般來說都是繼承自 `UIView` 這個父類別。在我們的項目中就是 `PhotoView` 這個類。
* 控制器 (Controller)：

  控制器是整個系統的掌控者，它連接了模型層和數據層，並且把數據在視圖層展示出來，監聽各種事件，負責數據的各種操作。

> 在我們的專案中哪個是控制器？`MainViewController` 這個類別就是。

如果你的項目遵循 MVC 的設計模式，那麼各種對象要不是 Model ，要不是 View ，要不就是 Controller。

> 當然在實際的開發中也可以靈活變化，其實到目前為止，大家無論是練習甚至實際開發，只聽過 MVC ，卻不一定會完全遵守。

三者之間的關係如下：

![](/files/-Lejh2D6jgzRLZ2IJkwB)

模型層通知控制器層任何數據的變化，然後控制器層會刷新視圖層中的數據。視圖層可以通知控制器層用戶的交互事件，然後控制器會處理各種事件以及刷新數據。

你可能會感覺奇怪：為什麼要把這三個東西分開來，而不能放在一個類別裡呢？那樣似乎更簡單一點嘛。

筆者之所以這樣做，是為了讓程式碼可以有更好的分離和重用。理想狀態下，視圖層應當和模型層完全分離，又稱為鬆耦合。如果視圖層不依賴任何模型層的具體實現，那麼就可以很容易的被其他模型重複使用，用來展示不同的數據。

舉個例子，比如在未來我們需要添加電影照片或者什麼書籍封面，我們依舊可以使用 `PhotoView` 這個類作為展示。

更久遠點來說，在以後如果你建立了一個新的專案並且需要用到和圖片相關的內容，你可以直接用 `PhotoView` 類別，因為它並不依賴於任何視圖模組。這就是 MVC 的強大之處，三大元素，各司其職，降低全部程式碼的耦合性。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wilden-chen.gitbook.io/swift-design-patterns/mvc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
