iOS 中架構模式的淺顯理解

咱們開發軟件中應用各類模式,主要是爲了git

  1. 職責劃分:一個類只作一件事
  2. 易用,可維護,方便擴展
  3. 解耦,相互獨立,可單獨測試

各類設計模式其實都是在解決上面的問題,讓咱們對比看看吧。github

1、如何理解MVC設計模式

在一般的定義中,MVC 是下圖的結構數據庫

可是在 cocoa 體系中,蘋果建議的 MVC 模式以下圖所示編程

在斯坦福課程中,解釋的 MVC 以下圖所示設計模式

綜合一下在 cocoa 系統中能夠這麼理解:網絡

  • M model,存儲、定義、操縱數據
  • V view,用戶看到的UI,可以和用戶交互
  • C controller,協調者,把 model 的數據放到 view 中展現,相應 view 的交互改變 model
    特別在 cocoa 系統中
    C 持有一個 model,直接操做 model;model 經過 KVO、通知等方式拋出本身改變的事件
    C 經過 IBOutlet 或者直接持有一個 view,他能夠直接操做這個view;view 有了交互,能夠經過action target 方式 以及 delegate 方式 讓 controller 來響應事件,可是 view 並不知道具體是哪一個類對象;view 的須要的數據,能夠經過 protocol 的方式,讓 controller 實現這個 protocol 而且成爲 view 的數據源,來提供數據給 view,view並不須要知道 controller 的具體的類對象。

最簡單的例子就是 UITableviewController,他通常會持有一個 NSArray 做爲 model,同時根視圖就是一個 UITableView,這是 view。controller 從網絡或者本地加載數據賦值給 array,而後 reload tableview。tableview 繪製時請求數據源,相應用戶事件會經過delegate 發起調用。tableview 與 array 並無直接的關係。數據結構

進一步的,若是個人頁面很複雜,那麼這個 MVC 是怎麼處理的呢?看看斯坦福的另外一張講義:
mvc

也就是 cocoa 中,Controlelr 控制的 view 能夠是屬於別的 MVC 中的,最外層的 MVC 來管理這些子 MVC。因此最好不要一個 C 中對應多個 view 或者 model,而是須要拆分紅多個 MVC 來。mvvm

缺點:測試

  1. 若是嚴格按照MVC模式的話,不像 view 傳遞 model,那麼代碼就會臃腫,想象往一個cell 設置用戶信息,單獨傳一個 userModel,而後 cell 內部處理會很簡潔,若是分開在controller 裏面傳 頭像、姓名、簽名,就會很臃腫
  2. view 和 controller 通常都是綁定在一塊兒的,生命週期的控制依賴於 controller,獨立測試會很不方便

2、MVP 模式

基於 MVC 的缺點和優勢,既然 view 和 cocoa 中的 viewController 已經那麼強的緊密耦合了,那麼把這二者當作同一個東西,一塊兒作爲一個 view 。
Model 層負責數據的增刪改查(網絡,數據庫查詢,本地文件讀寫)。
Presenter 層只是一箇中介,負責數據的轉發。

上圖展現的是 View 持有 Presenter,Presenter 持有 Model。因此 Presenter 不依賴於具體的 View,這個能夠經過 Protocol 來實現,讓 View 實現一些數據更新的協議,presenter 就能夠不知道View 具體是什麼就能傳遞數據。

優勢:
每一層的任務互相獨立分開了,讓測試更加方便。

** 缺點:**
代碼量會提高不少。

示例見參考2.參考2的複雜MVP能夠簡化以下圖所示:

3、MVVM 模式

MVP 的 Presenter 須要主動更新 view,若是增長一個綁定機制呢,model 的改變及時反饋在 view上會不會更酷。可是這樣就會讓 model 和 view 關聯起來,因此就出來一個 viewModel 的東西。

ViewModel 持有 Model,管理 Model 並能夠把 Model 中的數據處理成 View 須要的數據。同時能夠處理用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其餘各類各樣的代碼。
View 持有 ViewModel,而且和 ViewModel 中的數據綁定,讓 ViewModel 中的數據改變及時反應在 View上;而且把一些按鈕事件的 target 設置給 ViewModel。

優勢:

  • View Model 的引入配合狀態流和響應式編程使得 App 的結構更加清晰,交互更加流暢。
  • MVVM 中的 View 責任多一點,由於要設置綁定,但也由於綁定,因此代碼量更少。測試時主要是測試 View Model 和 Model 。

缺點:
由於數據的雙向綁定,讓BUG的定位更加困難,過大的項目也會耗費更多的內存。

4、VIPER 模式

VIPER 實際上是 MVP 的一種擴展,VP不變,M變成了 Interactor 和 Entity,外加一個 Routing。Entity 就是 model 的數據結構, Interactor 就是處理 model 的類,增刪改查model,Routing 就是控制視圖的跳轉。能夠看到 viper 模式分的更細,每層的功能更明確,更容易測試。可是也更復雜,代碼量也會更加龐大。

能夠參考下面兩個圖結構圖。
圖一:

圖二:

參考1.https://www.objc.io/issues/13-architecture/mvvm/ 參考2.https://github.com/amacou/MVPExample 參考3.https://www.objc.io/issues/13-architecture/viper/

相關文章
相關標籤/搜索