標籤:代碼 事件 關係 開始 國內 present alt reset add
引言:
Android架構的發展的過程就是一個不斷化繁為簡的過程,大家都在研究如何正確方便高效的規範代碼。當然這條路也永遠不會停止,就像新的芽兒,隨著時間的流逝,每天都在長出新的枝葉,每天都在成長。對於技術,每次新架構的提出都在剔除舊架構的詬病和痛點,演變成更方便,更高效,更簡潔的新架構,然後新的架構在具體使用中又會帶來新的詬病和痛點,反反覆複,無窮盡也......從開始使用MVC到使用MVP,從MVP到MVVM,每次架構的提出都有讓我們眼前一亮的東西,但具體使用中確還是存在很多的痛點,似乎一直存在一種反作用力來阻止我這樣做。但又能怎樣?新的芽兒註定會長成參天大樹,技術終究只會進步。
概述
MVC
MVC這裡就不多說了,大家都熟悉的不能再熟悉了,比較古老的架構了,相信大家也都使用過;
MVC具體使用
MVC的詬病
MVP
MVP是在MVC的基礎上把Control獨立出來的模型,簡化Control的內容,這裡Presenter充當中間代理的角色,view和Model不直接互動,而是通過Presenter
MVP的具體使用
MVP的詬病
粒度很難把握,使用過MVP的都知道,MVP模型需要定義比較多的介面,View需要定義介面,presenter需要定義介面,以前我們使用一個activty能解決的問題,現在要將一個Activity分解成一個View,一個Preseter,一個Model,每個模組都需要使用介面來實現解耦,這樣就會導致有時候一個activity中涉及的業務比較多,按每個業務點搭建MVP模型的話,會導致原來一個Activity類能搞定的,現在需要擴充成多個介面,多個類才能實現;粒度大的話,可能結構不清晰;粒度小的話,代碼量又會比較大;
MVP是以UI和事件為驅動的模型,資料的擷取是被動的根據UI變動的,我們更希望是資料變化去更新UI,而不是反過來;
Presenter和View耦合度比較高;
Presenter類在業務比較複雜情況下,代碼量比較大;
MVVM
MVVM是在MVP的基礎上,根據Google提出的DateBinding方案重新設計的一個靈活高效的架構,MVVM使用ViewModel一層代替原來的Presenter層;
MVVM的使用
MVVM的優點
資料驅動
在MVVM中,資料的變化可以自動更新view,不需要擷取view的引用;
耦合較低
MVP模式中View和Presenter是強耦合的,Presenter需要拿到View的引用,這樣當View變動時,Presenter也需要變化,耦合度太高;現在MVVM中,ViewModel只負責資料和業務,View的變化,ViewModel不需要關係,資料變化,View自動更新,耦合度比較低;
View更新
MVVM模型中不用考慮是否在主線程中更新UI,DateBinding會負責在主線程中更新UI的,我們不用擔心線程的問題,簡單的不止一點點;
可重複利用
一個ViewModel就是一個資料來源,可以將一個ViewModel綁定到不同的View中,就可以達到更新view目的
MVVM的詬病
MVVM由於是基於google的DataBinding架構的,而DataBinding支援的綁定View還比較少,因此在使用的過程中可能會遇到某些view無法使用DateBinding的情況,這點也是我之前沒有使用MVVM的原因
既然存在上面的問題,國內外的大牛已經幫我們封裝好了一套使用dateBinding的view庫,為避免重複造輪子,我們可以將它引入到我們的項目中直接使用,目前我知道的已經支援常用所有View;
總結
經過上面對不同架構的對比,相信大家都有一個基本的瞭解,有人會問這麼多架構,我們使用那個比較好呢?
個人覺得,技術是在不斷進步,舊的架構最終都會被新的架構所代替,我覺得MVVM的提出解決了我們使用其他架構的很多痛點,我覺得使用MVVM會更好點。
Android 設計模式對比