引言
??第一個簡單的問題:請問MVC模式是設計模式嗎缚柏?答案:不是。如果你對設計模式和架構模式還有認識上的誤區(qū)元暴,那你就要警惕了匈挖!
??第二個簡單的問題:請問你在什么時候使用到MVC模式?是在Java開發(fā)后臺的時候思灰?還是在前端開發(fā)玷犹,比如Android開發(fā)?
??第三個簡單的問題:在使用MVC模式從事開發(fā)的過程中洒疚,你有沒有發(fā)現(xiàn)它這個模式本身有什么局限性歹颓,或者有什么可以改進的地方?
??可以說油湖,這是靈魂三問了吧巍扛!今天我們要介紹的MVVM模式,就是MVC模式的升級版乏德,它針對MVC模式的短板進行了改進撤奸,是現(xiàn)如今Android開發(fā)過程中最常見的架構模式,今天我們就來認識它喊括。(靈魂三問的答案先賣個關子寂呛,讀完文章你就知道了)
介紹
??首先,要搞明白MVVM模式瘾晃,它是一種架構模式贷痪,有別于設計模式。這兩種是有本質區(qū)別的蹦误,設計模式只是為了解決一類問題而總結出的抽象方法劫拢,比如單例模式,就是防止對象被多次實例化强胰;而架構模式往往能使用多種設計模式舱沧。
??MVVM是Model-View-ViewModel的簡寫,MVVM模式實現(xiàn)了數(shù)據(jù)視圖的綁定(DataBinding)偶洋,當數(shù)據(jù)變化時熟吏,視圖會自動更新;反之玄窝,當視圖發(fā)生改變時牵寺,數(shù)據(jù)也會自動更新。
??說人話恩脂?來設想一下帽氓,比如你要調用接口獲取數(shù)據(jù),進而在視圖中展示給用戶俩块,那如果出現(xiàn)了這種情況黎休,數(shù)據(jù)改變了呢浓领?你是不是在想重新請求下接口數(shù)據(jù),再獲取到就OK了啊势腮,重新請求接口是沒錯联贩,但拿到的數(shù)據(jù),怎么更新捎拯?還需要繁瑣地設置各種填充數(shù)據(jù)流吧撑蒜?這就是MVC的設計思路,而MVVM所做的事情玄渗,就是簡化其將數(shù)據(jù)轉化為視圖的過程Wぁ(再不懂就沒道理了啊L偈鳌)
解析
何為MVVM模式浴滴?介紹的太皮毛了!
拆分來看:Model+View+ViewModel
對比MVC:Model+View+Controller
??看出區(qū)別了嗎岁钓?Model+View兩者都一樣有升略,無非是數(shù)據(jù)保存和用戶界面,它們最大的區(qū)別就在于M與V的交互方式不同屡限,MVC模式采用Controller來處理業(yè)務邏輯品嚣,而MVVM則采用ViewModel來處理。
具體來說:
對比MVC模式:
??用戶操作> View (負責接受用戶的輸入操作)>Controller(業(yè)務邏輯處理)>Model(數(shù)據(jù)持久化)>View(將結果通過View反饋給用戶)钧大。
??先不說其他翰撑,請問把所有的業(yè)務邏輯都交給Controller來進行會出現(xiàn)什么問題?
1.所有業(yè)務邏輯都在Controller里操作啊央,邏輯復雜且不利于維護眶诈。
2.大量的DOM 操作使頁面渲染性能降低,加載速度變慢瓜饥,影響用戶體驗逝撬。
3.當 Model 頻繁發(fā)生變化,需要主動更新到View乓土;當用戶的操作導致Model發(fā)生變化宪潮,同樣需要將變化的數(shù)據(jù)同步到Model中, 這樣的工作不僅繁瑣趣苏,而且很難維護復雜多變的數(shù)據(jù)狀態(tài)狡相。
于是MVVM出現(xiàn)了,它來了它來了拦键,它帶著自動更新走來了谣光!
??ViewModel 是一個同步View 和 Model的對象檩淋。View 和 Model 之間并沒有直接的聯(lián)系芬为,而是通過ViewModel進行交互萄金。ViewModel 通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來,而View 和 Model 之間的同步工作完全是自動的媚朦,無需人為干涉氧敢,因此開發(fā)者只需關注業(yè)務邏輯,不需要手動操作DOM, 不需要關注數(shù)據(jù)狀態(tài)的同步問題询张,復雜的數(shù)據(jù)狀態(tài)維護完全由 MVVM 來統(tǒng)一管理孙乖。
??數(shù)據(jù)視圖雙向綁定VM雙向綁定:在 MVVM 框架中,View(視圖) 和 Model(數(shù)據(jù)) 是不可以直接通訊的份氧,在它們之間存在著 ViewModel 這個中間介充當著觀察者的角色唯袄。當用戶操作 View(視圖),ViewModel 感知到變化蜗帜,然后通知 Model 發(fā)生相應改變恋拷;反之當 Model(數(shù)據(jù)) 發(fā)生改變,ViewModel 也能感知到變化厅缺,使 View 作出相應更新蔬顾。這個一來一回的過程就是我們所熟知的雙向綁定。而這一切就需要大師兄DataBinding(JetPack中的一個成員湘捎,進行數(shù)據(jù)綁定)來實現(xiàn)诀豁。
操作步驟:
(1)提供View,ViewModel以及Model三層窥妇;
(2)將布局修改為DataBinding布局舷胜;
(3)View與ViewModel之間通過DataBinding進行通信;
(4)獲取數(shù)據(jù)并展示在界面上活翩。
優(yōu)缺點
優(yōu)點:
1.簡化了界面與業(yè)務的依賴性逞带,也解決了數(shù)據(jù)的頻繁更新的問題。
2.實現(xiàn)了數(shù)據(jù)和視圖的雙向綁定纱新,極大地簡化了代碼展氓。
3.減少了接口數(shù)量;
4.告別了繁瑣findViewById操作脸爱;
缺點:
bug難以調試遇汞,并且DataBinding目前還存在一些編譯問題。
總結:
??要學好MVVM模式簿废,需要先學習了解DataBinding和LiveData空入。
DataBinding是MVVM數(shù)據(jù)綁定的工具。
??LiveData可以更好的解決MVVM之間的通信問題族檬,并且它可以更好地感知組件的生命周期歪赢,能夠有效地避免內存泄漏。
閑話
??在我的印象中单料,MVVM模式埋凯,就是一個取經團隊点楼,其中DataBinding是大師兄悟空,LiveData是二師兄悟能白对,Lifecycle則是三師弟悟凈掠廓。
??DataBinding(大師兄)負責將肉眼可見的所有視圖精怪都整理好,交由ViewModel(玄奘)來處理業(yè)務邏輯甩恼,但看過大話西游的都知道蟀瞧,悟空好斗,而玄奘良善条摸,二者不可溝通悦污,這就需要LiveData(二師兄)來進行溝通兩者了,事實上LiveData就是為了解決DataBinding與ViewModel之間的通信問題而出現(xiàn)的钉蒲,ViewModel調用接口獲取數(shù)據(jù)(如來給它的)塞关,LiveData負責通知DataBinding,師傅要你更新視圖子巾,因為數(shù)據(jù)更改了帆赢,而Lifecycle(悟凈)一直默默支持著大師兄,二師兄线梗,以及師傅椰于。
Tips
??第一:MVVM模式中的DataBinding是非必須的。也就是說可以不用DataBinding實現(xiàn)MVVM模式仪搔。
??第二:ViewModel配合LiveData更新數(shù)據(jù)瘾婿,只是它作為輔助的功能,它最主要的功能是共享數(shù)據(jù)烤咧。在Activity和Fragment復用同一個ViewModel時偏陪,Activity中的數(shù)據(jù)更改后,F(xiàn)ragment無需任何多余操作煮嫌,可以自動更新數(shù)據(jù)笛谦。