本文參考:ios
iOS 架構模式 - 簡述 MVC, MVP, MVVM 和 VIPER (譯)編程
在整個 GUI 編程領域,MVC 已經有將近50年的歷史,而且產生了不少變種,例如 MVA、MVP、MVVM 等等。其實 MVC 並無一個明確的定義,網上也流傳着各類各樣的 MVC 架構圖。框架
MVC自己的框架思想很是的優秀,當出現問題時首先要考慮的並非去替換掉現有的框架而是從設計的角度去優化現有的代碼以及邏輯,讓整個系統達到一個最優的組合。ide
學習iOS開發不久,就開始接觸MVC這個最出名而且應用最普遍的架構模式。也開始逐漸去了解其餘架構模式。學習
MVC、MVP、MVVM模式都是把全部的實體歸類到了下面三種分類中的一種:測試
Models - 負責持有數據,進行數據處理的數據訪問層。設想一下Person,PersonDataProvider類。優化
Views - 負責數據展示層(Graphical User Interface),在iOS端可認爲全部以UI前綴的類。spa
Controller/Presenter/ViewModel - 負責協調處理Models和Views之間的交互。.net
ASP.NET MVC:
在微軟的ASP.NET MVC Overview一文中,描述了 MVC 模式,在此引用文章的描述示意圖:
基於此圖我簡單的理解爲:
View展現Model中的內容;Controller管理View和Model。
Spring MVC:
與 ASP.NET 不一樣,Spring MVC 對於 MVC 架構模式的實現就更加複雜了,增長了一個用於分發請求、管理視圖的 DispatchServlet:
Model、View 和 Controller 之間的關係能夠理解爲:
經過 DispatchServlet 將控制器層和視圖層徹底解耦; 視圖層和模型層之間沒有直接關係,只有間接關係,經過控制器對模型進行查詢、返回給 DispatchServlet 後再傳遞至視圖層;
Cocoa MVC:
理想狀態的Cocoa MVC不作詳細說明,實際上的Realistic Cocoa MVC其實甚至被人稱爲重控制器模式。雖然 View 和 View Controller 是技術上不一樣的組件,但它們幾乎老是手牽手在一塊兒,成對的。咱們正規化它的示意圖:
其實我實際上編寫的代碼,的確許多邏輯被放在了View Controller裏。
若是對於你的小項目,不打算投入不少時間去設計架構,也不打算投入太多成本去維護,那麼Cocoa MVC是你要選擇的模式。
在開發速度上,Cocoa MVC是最好的架構模式。
而MVVM:
在典型的 MVC 應用裏,許多邏輯被放在 View Controller 裏。它們中的一些確實屬於 View Controller,但更多的是所謂的「表示邏輯(presentation logic)」,以 MVVM 屬術語來講,就是那些將 Model 數據轉換爲 View 能夠呈現的東西的事情,例如將一個 NSDate 轉換爲一個格式化過的 NSString。
咱們的圖解裏缺乏某些東西,那些使咱們能夠把全部表示邏輯放進去的東西。咱們打算將其稱爲 「View Model」 —— 它位於 View/Controller 與 Model 之間:
MVVM其實就是一個 MVC 的加強版,咱們正式鏈接了視圖和控制器,並將表示邏輯從 Controller 移出放到一個新的對象裏,即 View Model。MVVM 聽起來很複雜,但它本質上就是一個精心優化的 MVC 架構。
其具體的使用還待實踐後的補充~
一個好的架構應有的特徵:
Cocoa MVC:
劃分 - View和Model確實是分離了,可是View和Controller仍是牢牢地耦合在一塊兒。
可測試性 - 因爲劃分的很差,你可能只能測試你的Model。
易用性 - 相比於其餘模式代碼量最小,此外門檻低,每一個人都能熟練掌握,即便不是一個很是有經驗的開發者也能進行維護。
關於這幾點本人深有同感,特別是第三點,這也是前輩們教我上手提升效率的體現。再加上上文說的開發速度、不用過多時間去設計架構的優勢,Cocoa MVC成爲了外包公司的主要選擇之一。
MVVM:
劃分 - MVVM 框架裏面的 View 比 MVP 裏面負責的事情要更多一些。由於前者是經過 ViewModel 的數據綁定來更新自身狀態的,然後者只是把全部的事件通通交給 Presenter 去處理就完了,本身自己並不負責更新。
可測性 - 由於 ViewModel 對 View 是一無所知的,這樣咱們對它的測試就變得很簡單。View 應該也是可以被測試的,可是可能由於它對 UIKit 的依賴,你會直接略過它。
易用 - 在實際的應用當中 MVVM 會更簡潔一些。而在 MVVM 下,你只須要用綁定就能夠解決更新 View 的狀態。
筆記內容略粗糙,其實和本人理解不深有很大關係,更準確,更深的內容仍需不停學習以及實踐!