MVC和MVVM以及MVP的介绍
前言
1,MVC、MVVM、MVP都屬于框架模式
- 框架是對軟件進行分工,設計模式是對具體問題提出的解決方案,兩者有本質的區別
2.MVC模式是面向開發最常用的模式,同時也是最經典的模式
- 其他的模式還有MTV、MVP、CBD、ORM等等很多
3.所有的其他模式MVVM或者MVP都是在MVC的基礎上建立的
- MVC模式是任何模式的根源,有萬變不離其宗之理
4.一個項目并不是只有一個MVC和一個MVVM,而可能是每一個功能每一個界面都對應了一個MVC
- 所以一個完整的項目是由很多個MVC和MVVM或者MVP組成的
5.目前網絡上的水軍很多,有很多人混了一年半載開發經驗,然后看了一兩篇文章就覺得MVC怎么怎么不好,有說MVVM模式多么多么牛逼的,也有說MVP模式多么多么牛逼的
- 其實這也反映了市場上很多人對框架模式的一知半解的態度
- 筆者認為,任何一款軟件都是在面對不同的功能時針對這幾種模式之間有一個良好的權衡,而不是一位的偏袒某一種模式
- 其實這也反映了市場上很多人對框架模式的一知半解的態度
思考題1:應用軟件是由什么組成的?
- 由展示視圖的和對于的邏輯代碼組成的
- 視圖對應的就是View層,邏輯代碼對于的就是Model層
思考題2:視圖和模型之間是直接進行交互的嗎?
- 視圖和模型之間并不直接進行交互,而是通過控制器(controller)的協調來進行交互
- 這就是MVC模式的組成結構:視圖(View)、控制器(Controller)、模型(Model)
1.1-MVC模式
實例:當用戶點擊一個按鈕,請求網絡數據,然后刷新當前taleview
1.首先c層獲取用戶的點擊按鈕事件,然后向M層發送指令請求數據
- 注意:此時M層請求的數據并不是直接丟給界面的tableview,而是將對象的模型M傳遞給C層
- M層是通過代理來傳遞給C層的(網絡請求類的代理或者block回調)
- 注意:此時M層請求的數據并不是直接丟給界面的tableview,而是將對象的模型M傳遞給C層
2.C層獲取到M層返回的網絡數據之后,直接在C層給V層(tableview)發送刷新的指令reloadData
3.當V層(tableview)想要告知C層我已經準備開始刷新了,你給我數據吧,是通過代理和數據源方法來告知的
MVC模式的核心就是定義了視圖(view)、控制器(controller),數據(model)之間各行其道不能越界的職責
- 可以聯想到交通規則中的實線不能便道,虛線可以變道的規則
MVC模式的優點(由于MVC很好的分離了視圖層和業務層,所以它具有以下優點)
- 耦合度低
- 開發速度快
- 可維護性高
MVC模式的缺點
- 由于一味地強調每一個層級之間的嚴格關系,當MVC三者之間,當C層需要處理的邏輯很多或者V層界面展示非常復雜的時候,就會導致某一個View文件或者Controller文件代碼非常的多,甚至有四五千行代碼的時候,我們維護起來就非常的麻煩。
1.2-MVVM模式
此處有筆誤,應該是MVVM模式下是將C層拆分成M層和V層,也就是常說的ViewModel
MVVM模式產生的由來就是當MVC模式下的C層代碼量很多的時候將其拆分成M層和C層
- 比如說父子控制器可以理解成是MVVM模式
- ViewModel也是一種MVVM模式的體現,ViewModel本身是一個對象,它的內部維護了視圖和視圖對應的邏輯
MVVM模式的本質就是對MVC模式進行一個拆分,解決了MVC模式下代碼臃腫的問題
MVVC模式的優點
- 可復用性比MVC模式高(拆分的V和M可以被其他的mvc或者mvvm復用)
- 耦合度低
MVVM模式缺點
- 項目文件增多
1.3-MVP模式
MVP模式的定義
- 作為一種新的模式,MVP與MVC有著一個重大的區別:在MVP中View并不直接使用Model,它們之間的通信是通過Presenter (MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過 Controller。
- *也就是說,如果MVC模式中V不能直接訪問M,就和MVP無異
- 作為一種新的模式,MVP與MVC有著一個重大的區別:在MVP中View并不直接使用Model,它們之間的通信是通過Presenter (MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過 Controller。
關于MVP模式誤區的解讀
- MVP模式主要是解決MVC模式下V可以直接訪問M導致耦合度很高的問題,但是根據網易公開課斯坦福大學教授的說法,MVC模式中V和M本來就是不能夠進行交互的
- 所以MVP模式的誕生個人認為是一個笑話,是對MVC模式理解的不夠深刻所導致的
- MVP模式主要是解決MVC模式下V可以直接訪問M導致耦合度很高的問題,但是根據網易公開課斯坦福大學教授的說法,MVC模式中V和M本來就是不能夠進行交互的
以下是網易公開課斯坦福大學教授Paul Hegarty(世界知名級教授)講解MVC模式的示意圖
- 視頻鏈接http://open.163.com/special/opencourse/ios8.html
1.4-框架模式的總結
所有的MVC或者MVVM模式的目的都是為了代碼的解耦和易讀性,MVC之間的溝通本質上還是OC的對象間消息機制的使用,以下是oc中的三種消息機制
- 代理
- 通知
- kvo
什么時候使用MVC,什么時候使用MVVM,這主要是由具體的業務需求所決定的
- 業務需求很簡單,控制器代碼量不復雜(低于兩千行代碼),優先考慮MVC
- 業務需求比較復雜,控制器代碼量很多(高于兩千行)或者V和M的復用性極高,可以考慮MVVM
總結
以上是生活随笔為你收集整理的MVC和MVVM以及MVP的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象之设计模式
- 下一篇: KVC/KVO原理详解及编程指南