上一篇文章中我們講解了關于Android開發過程中常見的內存泄露場景與檢測方案。Android系統為每個應用程序分配的內存是有限的,當一個應用中產生的內存泄漏的情況比較多時,這就會導致應用所需要的內存超過這個系統分配的內存限額,進而造成了內存溢出而導致應用崩潰。在實際的開發過程中我們由于對程序代碼的不當操作隨時都有可能造成內存泄露。具體更多關于Android常見內存泄露與檢測的內容可參考我的上篇文章。
本文我們將講解Android開發中常常涉及到的MVC/MVP/MVVM等模式的基本概念。許多童鞋對Android開發中涉及到的MVC、MVP、MVVM這三種模式不是太清楚,我認為無論是MVC、MVP亦或者是MVVM都是一種代碼組織方式,通過這種代碼組織方式能夠讓代碼更有層次感,各個層次主要負責各自的工作,這樣降低了整個項目的代碼邏輯耦合度與可讀性。
下面對MVC、MVP、MVVM等設計模式逐一的做一下說明:
**MVC開發模式**:
MVC,即Model層,View層,Control層,在JAVAEE中MVC是一種經典的開發模型,下面是引用的一段對其的說明:
> MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。其中M層處理數據,業務邏輯等;V層處理界面的顯示結果;C層起到橋梁的作用,來控制V層和M層通信以此來達到分離視圖顯示和業務邏輯層。
簡單來講就是:
* 視圖(View):用戶界面
* 控制器(Controller):業務邏輯
* 模型(Model):數據保存
**MVC它的數據流轉**:

(盜用了一下網上的圖…)
* 用戶操作界面,View接受指令,View 傳送指令到 Controller,也就是從View層到Control層的箭頭所示
* Controller 完成業務邏輯后,要求 Model 改變狀態,也就是從Control層到Model層的箭頭所示
* Model 將新的數據發送到 View,用戶得到反饋,也就是從Model層到View層的箭頭所示
**Android中MVC模式的體現**:
其實Android開發的主要流程都是MVC模式的,比如我們常見的Activity+Layout+Model展示業務邏輯的模式,其中:
* Activity - 對應著Controller層,主要是控制層,用于實現業務邏輯
* Layout - 對應著View層,主要用于展示頁面
* Model - 對應著Model層,主要是保存數據
**MVC模式的優勢**:
* 使用MVC模式降低了程序中的耦合度,使應用程序視圖層與Model層分離,減少了代碼之間的相互影響;
* 由于使用MVC模式降低代碼耦合度,因此可以很方便的擴展現有程序;
* 不同代碼模塊職責劃分明確,有利于代碼的維護與升級;
**MVP開發模式**:
MVP開發模式是MVC模式一種進階,MVP和MVC模型的主要區別是model層與View層不再發生關系而是通過Presenter層作為中間的樞紐。并且各個部分之間都是雙向關聯的;
簡單來講就是:
* 視圖(View):用戶界面
* 控制層(Presenter):業務邏輯(負責與View層和Model層雙向交互)
* 模型(Model):數據保存
**MVP它的具體數據流轉是這樣的**:

(盜用了一下網上的圖…)
* 用戶操作界面,View接收指令,View傳送指令到Presenter層,也就是從View層到Presenter層的箭頭所示
* Presenter完成業務邏輯后,要求Model改變狀態,也就是從Presenter層到Model層的箭頭所示
* Model狀態改變之后將結果返回給Presenter層,然后Presenter層在將結果反饋到View層,也就是從Model層到Presenter層,從Presenter層到View層的箭頭所示
在MVP里,Presenter完全把Model和View進行了分離,主要的程序邏輯在Presenter里實現。而且,Presenter與具體的View是沒有直接關聯的,而是通過定義好的接口進行交互,從而使得在變更View時候可以保持Presenter的不變。
**MVP模式的優勢**:
* MPV開發模式與MVC開發模式有的優勢相似,都是降低了代碼的耦合度
* 使用MVP模式View層與Model層不在相互關聯,可以更高效地使用模型,因為所有的交互都發生在一個地方——Presenter內部
**MVVM它的具體數據流轉是這樣的**:
MVVM與MVP是相類似的,唯一的區別是,它采用雙向綁定(data-binding):View的變動,自動反映在 ViewModel,反之亦然。
簡單來講就是:
* 視圖(View):用戶界面
* 控制層(VM):業務邏輯(負責與View層和Model層雙向交互)
* 模型(Model):數據保存

(盜用了一下網上的圖…)
* 用戶操作界面,View接收指令,View傳送指令到Presenter層
* ViewModel完成業務,改變Model層數據
* Model狀態改變之后將結果返回該ViewModel層,然后ViewModel層自動更新View層顯示
注:google提供的官方data binding框架采用的就是MVVM模型,關于databinding框架的相關知識可參考:[完全掌握Android Data Binding](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html)
參考文章:
[MVVM大話開篇 ](http://www.cnblogs.com/lori/p/3501764.html)
[MVC,MVP 和 MVVM 的圖示](http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html)
另外對產品研發技術,技巧,實踐方面感興趣的同學可以參考我的:
[Android產品研發(十一)–>應用內跳轉scheme協議](http://blog.csdn.net/qq_23547831/article/details/51685310)
[Android產品研發(十二)–>App長連接實現](http://blog.csdn.net/qq_23547831/article/details/51719389)
[Android產品研發(十三)–>App輪詢操作](http://blog.csdn.net/qq_23547831/article/details/51764773)
[Android產品研發(十四)–>App升級與更新](http://blog.csdn.net/qq_23547831/article/details/51764773)
[Android產品研發(十五)–>內存對象序列化](http://blog.csdn.net/qq_23547831/article/details/51779528)
[Android產品研發(十六)–>開發者選項](http://blog.csdn.net/qq_23547831/article/details/51809497)
[Android產品研發(十七)–>hybrid開發](http://blog.csdn.net/qq_23547831/article/details/51812985)
[Android產品研發(十八)–>webview問題集錦](http://blog.csdn.net/qq_23547831/article/details/51820139)
[Android產品研發(十九)–>Android studio中的單元測試](http://blog.csdn.net/qq_23547831/article/details/51868451)
[Android產品研發(二十)–>代碼Review](http://blog.csdn.net/qq_23547831/article/details/51833080)
[Android產品研發(二十一)–>Android中的UI優化](http://blog.csdn.net/qq_23547831/article/details/51868453)
[Android產品研發(二十二)–>Android實用調試技巧](http://blog.csdn.net/qq_23547831/article/details/51868496)
[Android產品研發(二十三)–>Android中保存靜態秘鑰實踐](http://blog.csdn.net/qq_23547831/article/details/51953926)
[Android產品研發(二十四)–>內存泄露場景與檢測](http://blog.csdn.net/qq_23547831/article/details/52671165)
- 前言
- (一)–>實用開發規范
- (二)-->啟動頁優化
- (三)-->基類Activity
- (四)-->減小Apk大小
- (五)-->多渠道打包
- (六)-->Apk混淆
- (七)-->Apk熱修復
- (八)-->App數據統計
- (九)-->App網絡數據解析
- (十)-->盡量不使用靜態變量保存數據
- (十一)-->應用內跳轉Scheme協議
- (十二)-->App長連接實現
- (十三)-->App輪詢操作
- (十四)-->App升級與更新
- (十五)-->內存對象序列化
- (十六)-->開發者選項
- (十七)-->Hybrid開發
- (十八)-->webview問題集錦
- (十九)-->Android studio中的單元測試
- (二十)-->代碼Review
- (二十一)-->Android中的UI優化
- (二十二)-->Android實用調試技巧
- (二十三)-->Android中保存靜態秘鑰實踐
- (二十四)-->內存泄露場景與檢測
- (二十五)-->MVC/MVVM/MVP簡單理解