網上現在MVC、MVP以及MVVM的講解一搜一籮筐,根據了網上大多數的文章,根據我的思考習慣進行了總結。 MVC介紹及分析: 各層的職責如下所示: Models: 數據層,負責數據的處理和獲取的數據介面層。 Views: 展示層(GUI),對於 iOS 來說所有以 UI 開頭的類基本都屬於這層,界面 ...
網上現在MVC、MVP以及MVVM的講解一搜一籮筐,根據了網上大多數的文章,根據我的思考習慣進行了總結。
MVC介紹及分析:
各層的職責如下所示:
Models: 數據層,負責數據的處理和獲取的數據介面層。
Views: 展示層(GUI),對於 iOS 來說所有以 UI 開頭的類基本都屬於這層,界面元素搭建,動畫效果,數據展示。
Controller: 控制器層,它是 Model 和 View 之間的膠水或者說是中間人。一般來說,當用戶對 View 有操作時它負責去修改相應 Model;當 Model 的值發生變化時它負責去更新對應 View,響應View的事件和作為view的代理,處理view的生命周期以及處理界面之間的跳轉。
三者是完全獨立分開的,view和model是完全隔離的,而controller作為二者的中間人負責二者的交互,以保證復用性,但是因為controller是作為特定的場景存在的,多以很難服用,這也是MVVM和MVP產生的原因。 先說MVC: 想要做到上述這樣是很難的,因為一個界面的呈現是需要構建一個UIViewController的,但是每一個UIViewController都帶有一個view,這就導致了controller和view一起耦合在了ViewController裡面。iOS裡面的viewcontroller其實是view和controller的組合,目的就是為了提高開發效率,簡化操作。viewcontroller確實應付簡單頁面沒啥問題,認為真正的MVC就是這麼乾的,導致很多新手都把本來view層的代碼都堆到了VC,比如在VC裡面構建view、view的顯示邏輯,甚至在VC裡面發起網路請求。 對於model層的誤解: model層的正確定義是業務模型,而不是只有幾個乾巴巴的屬性,也就是你所有業務數據和業務實現邏輯都應該定義在M層裡面,而且業務邏輯的實現和定義應該和具體的界面無關,也就是和視圖以及控制之間沒有任何的關係,它是可以獨立存在的。其實這裡面涉及到一個最基本的設計原則,那就是面向對象的基本設計原則。類應該是一個個具有不同操作和不同屬性的對象的抽象(類是屬性和方法的集合),供C層調用的都是M層裡面一個個業務類所提供的成員方法來實現。 總結來說:M層不應該是數據模型,放幾個屬性就完事了。而應該是承載業務邏輯和數據存儲獲取的職責一層。 正確構建MVC:viewcontroller不是C層,而是V和C兩層的混合體。 為了給VC減負,我們現在把VC只當做一個view的容器來使用,因為UIViewController其中有一個self.view,所有的界面上的view都需要addSubview來添加,所以此時的UIViewController的職責就是 1、生成子view並添加到自己的self.view上面 2、管理view的生命周期 3、通知每個子Controller去獲取數據 MVC優點: 1、代碼復用: 三個小模塊的V(cell/userInfoView)對外只暴露Set方法, 對M甚至C都是隔離狀態, 復用完全沒有問題 2、代碼臃腫: 因為Scene大部分的邏輯和佈局都轉移到了相應的MVC中 3、易拓展性: 需要的只是新建相應的MVC模塊, 加到對應的UIViewController即可. 4、可維護性:修改模塊,不需要更改其他的地方 MVC最大的缺點:controller的代碼沒法復用C層的功能還有哪些了
1、作為View和Model的中介者,從model獲取數據,經過數據加工,渲染到view上面顯示
2、響應view的點擊事件,然後執行相應的業務邏輯
3、作為view的代理和數據源
4、暴露介面給UIviewController來驅動自己獲取數據
這也就造成了有一些model和view強耦合,有些業務邏輯(頁面跳轉/點贊/分享…)是直接散落在V層的,因為業務邏輯最終改變的是數據M, 我們的關註點應該在M上, 而不是展示M的V。
而MVP正是為瞭解決這一問題而誕生的,而MVVM是在MVP基礎上發展起來的。
MVVM也就是model、View 和 ViewModel;其中視圖模型(ViewModel)其實就是 MVP 模式中的P,在 MVVM 中叫做VM。在 MVVM 的實現中,還引入了隱式的一個 Binder層,這也是MVVM相對MVP的進步,而聲明式的數據和命令的綁定在 MVVM 模式中就是通過binder層來完成的。MVVM和MVP相對於MVC最大的改進在於:P或者VM創建了一個視圖的抽象,將視圖中的狀態和行為抽離出來形成一個新的抽象已達到復用的目的。
MVP的想法就是通過對view的事件處理,調用p的邏輯,時間執行成功後,p改變model的書籍,然後破獲掉view的代理乾煸view的顯示,但是時間多起來的話就很麻煩,這就是MVVM的binder機制,讓view的行為和狀態和p的行為狀態同步。