文章簡介:
1.此文章主要是為項目實戰(zhàn)前準(zhǔn)備所用
---------------------------------------進階篇(簡單介紹)----------------------------------------------
一、在正式使用之前,還是先簡單介紹一下數(shù)據(jù)綁定(MVVM):
1.之前筆者一直都是說數(shù)據(jù)綁定,沒有說它屬于哪種框架,其實,他既不屬于MVC,MVP,而是屬于MVVM。
2.分別介紹一下MVC,MVP,MVMV(雖然網(wǎng)上這樣的內(nèi)容很多,但還是介紹一下,其實我也是copy的)
MVC
MVC,Model View Controller,是軟件架構(gòu)中最常見的一種框架,簡單來說就是通過controller的控制去操作model層的數(shù)據(jù),并且返回給view層展示,具體見下圖
當(dāng)用戶出發(fā)事件的時候,view層會發(fā)送指令到controller層,接著controller去通知model層更新數(shù)據(jù),model層更新完數(shù)據(jù)以后直接顯示在view層上,這就是MVC的工作原理。
那具體到Android上是怎么樣一個情況呢?
大家都知道一個Android工程有什么對吧,有java的class文件,有res文件夾,里面是各種資源,還有類似manifest文件等等。對于原生的Android項目來說,layout.xml里面的xml文件就對應(yīng)于MVC的view層,里面都是一些view的布局代碼,而各種java bean,還有一些類似repository類就對應(yīng)于model層,至于controller層嘛,當(dāng)然就是各種activity咯。大家可以試著套用我上面說的MVC的工作原理是理解。比如你的界面有一個按鈕,按下這個按鈕去網(wǎng)絡(luò)上下載一個文件,這個按鈕是view層的,是使用xml來寫的,而那些和網(wǎng)絡(luò)連接相關(guān)的代碼寫在其他類里,比如你可以寫一個專門的networkHelper類,這個就是model層,那怎么連接這兩層呢?是通過button.setOnClickListener()這個函數(shù),這個函數(shù)就寫在了activity中,對應(yīng)于controller層。是不是很清晰。
大家想過這樣會有什么問題嗎?顯然是有的,不然為什么會有MVP和MVVM的誕生呢,是吧。問題就在于xml作為view層,控制能力實在太弱了,你想去動態(tài)的改變一個頁面的背景,或者動態(tài)的隱藏/顯示一個按鈕,這些都沒辦法在xml中做,只能把代碼寫在activity中,造成了activity既是controller層,又是view層的這樣一個窘境。大家回想一下自己寫的代碼,如果是一個邏輯很復(fù)雜的頁面,activity或者fragment是不是動輒上千行呢?這樣不僅寫起來麻煩,維護起來更是噩夢。(當(dāng)然看過Android源碼的同學(xué)其實會發(fā)現(xiàn)上千行的代碼不算啥,一個RecyclerView.class的代碼都快上萬行了呢。。)
MVC還有一個重要的缺陷,大家看上面那幅圖,view層和model層是相互可知的,這意味著兩層之間存在耦合,耦合對于一個大型程序來說是非常致命的,因為這表示開發(fā),測試,維護都需要花大量的精力。
正因為MVC有這樣那樣的缺點,所以才演化出了MVP和MVVM這兩種框架。
MVP
MVP作為MVC的演化,解決了MVC不少的缺點,對于Android來說,MVP的model層相對于MVC是一樣的,而activity和fragment不再是controller層,而是純粹的view層,所有關(guān)于用戶事件的轉(zhuǎn)發(fā)全部交由presenter層處理。下面還是讓我們看圖
從圖中就可以看出,最明顯的差別就是view層和model層不再相互可知,完全的解耦,取而代之的presenter層充當(dāng)了橋梁的作用,用于操作view層發(fā)出的事件傳遞到presenter層中,presenter層去操作model層,并且將數(shù)據(jù)返回給view層,整個過程中view層和model層完全沒有聯(lián)系。看到這里大家可能會問,雖然view層和model層解耦了,但是view層和presenter層不是耦合在一起了嗎?其實不是的,對于view層和presenter層的通信,我們是可以通過接口實現(xiàn)的,具體的意思就是說我們的activity,fragment可以去實現(xiàn)實現(xiàn)定義好的接口,而在對應(yīng)的presenter中通過接口調(diào)用方法。不僅如此,我們還可以編寫測試用的View,模擬用戶的各種操作,從而實現(xiàn)對Presenter的測試。這就解決了MVC模式中測試,維護難的問題。
當(dāng)然,其實最好的方式是使用fragment作為view層,而activity則是用于創(chuàng)建view層(fragment)和presenter層(presenter)的一個控制器。
MVVM
MVVM最早是由微軟提出的
從圖中看出,它和MVP的區(qū)別貌似不大,只不過是presenter層換成了viewmodel層,還有一點就是view層和viewmodel層是相互綁定的關(guān)系,這意味著當(dāng)你更新viewmodel層的數(shù)據(jù)的時候,view層會相應(yīng)的變動ui。
我們很難去說MVP和MVVM這兩個MVC的變種孰優(yōu)孰劣,還是要具體情況具體分析。
------------------------------------------------That's all--------------------------------------------------------
1.沒有給代碼而是我相信大部分人已經(jīng)知道了MVC,MVP的代碼怎么寫
2.這里只是講目前三種框架進行對比
3.原文的鏈接如下:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0414/4143.html
4.后面就開始真正的實戰(zhàn)了,大家激動吧,其實我更激動。利用上班時間寫的文章,難得的可以閑一天,測試了快一個月的Bug然后修復(fù),都快吐了。下周就準(zhǔn)備上線了,馬上就又要忙了。