咱們開發軟件中應用各類模式,主要是爲了git
各類設計模式其實都是在解決上面的問題,讓咱們對比看看吧。github
在一般的定義中,MVC 是下圖的結構數據庫
可是在 cocoa 體系中,蘋果建議的 MVC 模式以下圖所示編程
在斯坦福課程中,解釋的 MVC 以下圖所示設計模式
綜合一下在 cocoa 系統中能夠這麼理解:網絡
最簡單的例子就是 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
缺點:測試
基於 MVC 的缺點和優勢,既然 view 和 cocoa 中的 viewController 已經那麼強的緊密耦合了,那麼把這二者當作同一個東西,一塊兒作爲一個 view 。
Model 層負責數據的增刪改查(網絡,數據庫查詢,本地文件讀寫)。
Presenter 層只是一箇中介,負責數據的轉發。
上圖展現的是 View 持有 Presenter,Presenter 持有 Model。因此 Presenter 不依賴於具體的 View,這個能夠經過 Protocol 來實現,讓 View 實現一些數據更新的協議,presenter 就能夠不知道View 具體是什麼就能傳遞數據。
優勢:
每一層的任務互相獨立分開了,讓測試更加方便。
** 缺點:**
代碼量會提高不少。
示例見參考2.參考2的複雜MVP能夠簡化以下圖所示:
MVP 的 Presenter 須要主動更新 view,若是增長一個綁定機制呢,model 的改變及時反饋在 view上會不會更酷。可是這樣就會讓 model 和 view 關聯起來,因此就出來一個 viewModel 的東西。
ViewModel 持有 Model,管理 Model 並能夠把 Model 中的數據處理成 View 須要的數據。同時能夠處理用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其餘各類各樣的代碼。
View 持有 ViewModel,而且和 ViewModel 中的數據綁定,讓 ViewModel 中的數據改變及時反應在 View上;而且把一些按鈕事件的 target 設置給 ViewModel。
優勢:
缺點:
由於數據的雙向綁定,讓BUG的定位更加困難,過大的項目也會耗費更多的內存。
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/