MVC 模式的原理,它在 Android 中是如何運用的?
嚴格意義上說, ContentProvider 並非是一個數據模型,ContentProvider還只是在Data的層面,而不是Model的層面,Android 本身沒有像J2EE Hibernate 或者 Rails ActiveRecord 那樣的ORM 工具。
Android View 這一層倒是很接近MVC中的「View」,但是還是需要很多的 binding 的操作。
Android Controller 是很完備,提供Activity,Service,Broadcast 和 Receiver 等等機制。
謝謝邀請。
MVC模式的原理,設計模式,網上介紹很多。 M、V、C分別代表數據模型、視圖和控制。簡單而言,Android提供了基於XML的界面框架與存儲數據的ContentProvider組件,使絕大部分軟體可以直接使用MVC模式來實現,讓開發者在編寫自己的軟體時可以專註於業務邏輯的編寫。
界面框架提供了界面的渲染、狀態切換以及各種事件的拋出,應用程序提供簡單的XML文件,完成界面模塊。 ContentProvider為開發者提供了易用的數據模型。 開發者通過監聽界面、監聽ContentProvider,或通過api操作界面與ContentProvider,實現與視圖、數據模型的通信。 MVC的價值,在於各模塊的松耦合、復用,提高開發效率,Android中,三個模塊分離很明顯,界面框架和ContentProvider模塊得到充分復用,無需開發者關心。MVC 是一種取捨。用性能換取系統彈性。系統彈性,就是怎麼樣都搞不垮的能力。
MVC 的理想狀態。M 沒有數據冗餘,存儲的都是自由變數,所以從數據上不會產生 bug。View 每次都遍歷 M,即時計算出臨時數據,更新整個界面,所以從顯示上不會產生 bug。M 只通知 V 發生了變化而不說明變化是什麼,所以不論通知本身是否有重複或者順序問題,系統都不會有問題。
然後,這樣寫出來的系統,性能超級極端低下。必須不斷的向 M 加入數據冗餘,必須優化通知本身的頻度和信息。通過犧牲彈性達到用戶可用性。
MVC 是一個切入點,是起點而不是終點。樓主既然對Android MVC有興趣,你可以更進一步了解一下Martin Fowler的Presentation Model - Presentation Model。它是MVC模式的更新與更進一步。這個模式對包含UI的應用有深遠的影響。幾年前,我們開始了一個開源項目RoboBinding([url]http://robobinding.org[/url])。RoboBinding是一個實現Martin Fowler的Presentation Model構架模式(為MVC模式的更進一步)的Android框架。 目標為減少android應用開發工作量(可減少50%UI代碼量);促進清晰的項目結構;使項目代碼更易於測試(使大部分UI邏輯代碼可直接用JUnit測試)。在成熟的語言環境下都有對應的Presentation Model(MVVM/MVP微軟社區的叫法)實現框架如.Net的WPF與Silverlight,Java swing的JGoodies Binding。 我們在幾年前開始開發這個框架(我是項目的開發者之一)。現在類似的框架還有:Android-Binding, Bindroid,MvvmCross。RoboBinding是以Agile與Test driven development方式開發,注重代碼質量與可測試性,項目包含了300多個unit tests。有興趣的朋友可以了解一下。
這裡有介紹的中文視頻 - Android MVP MVVM Presentation Model模式與基於RoboBinding應用 (視頻質量太差) 或 https://www.youtube.com/watch?v=2sSBVaX77xA (視頻質量好)
Android的mvc模式並不完備,比如view背後的activity,既要完成ui的工作,又要做controller的活。追求完美的話,需要額外的工作,目前還沒看到比較好的框架。當然實際工程中也沒必要追求極致,夠用就好。
太多的追求模式有時候也會適得其反,MVC應用有時候也有太多的寬泛。
Android中有不少地方採用了MVC的設計模式,比如控制項這一塊,ListView的使用就是採用的MVC模式:用Adaptor將View和Data聯繫到一起。
順便提一句,Linux上很著名的GUI引擎GTK+也有不少是採用的MVC模式的,比如TreeView,但使用起來極其繁冗,比Android相去甚遠。所以同樣的MVC,運用的好壞,也是各有不同。
推薦閱讀:
※zencart 這個國外商城 CMS 源碼寫得怎樣?
※NodeJS的MVC是如何工作的?
※asp.net mvc 4 模型層為什麼可以通過簡單的 {get;set}就可以對數據進行設置和取得 這其中的實現原理是什麼?
※MVC和三層架構有何區別和聯繫?