我的MVVM之路

前言

了解前端的演化之路需要知道的兩件事

  1. 架構(gòu)不是一天實(shí)現(xiàn)而是演化出來(lái)的 </br>
  2. 架構(gòu)的出現(xiàn)是為了解決一個(gè)或者一類(lèi)問(wèn)題的
    </br>

UI包含什么通今?

在討論UI框架之前垒棋,我們先來(lái)了解一個(gè)頁(yè)面可能有的內(nèi)容眶蕉,一個(gè)UI頁(yè)面正常包含的內(nèi)容有

  1. 綁定事件遂蛀,即響應(yīng)用戶(hù)的操作,常見(jiàn)的事件有點(diǎn)擊窜醉,長(zhǎng)按埋同,滾動(dòng)
  2. 向業(yè)務(wù)獲得業(yè)務(wù)模型
  3. 展現(xiàn)模型蚯根,包括設(shè)置呈現(xiàn)內(nèi)容琼锋,調(diào)整顯示圖層等
  4. 動(dòng)畫(huà)
  5. 顯示

正常他們的流程關(guān)系?如下圖:


temp.jpg

正常來(lái)說(shuō)放闺,一個(gè)頁(yè)面的大部分內(nèi)容都應(yīng)該是源自業(yè)務(wù)的,只有少數(shù)部分是用戶(hù)操作引起的頁(yè)面內(nèi)容改動(dòng)與業(yè)務(wù)無(wú)關(guān)(如滾動(dòng))
</br>

蠻荒時(shí)代

在互聯(lián)網(wǎng)剛出現(xiàn)的時(shí)代缕坎,web端的html怖侦,js是全部寫(xiě)在一起的,同一個(gè)html既處理UI又處理業(yè)務(wù)谜叹,這種做法在那個(gè)剛起步的時(shí)代并沒(méi)有什么問(wèn)題匾寝,但隨著業(yè)務(wù)的發(fā)展,邏輯日趨復(fù)雜荷腊,這種做法的弊端開(kāi)始出現(xiàn)艳悔,整個(gè)業(yè)務(wù)邏輯變得復(fù)雜而難以維護(hù)
</br>

MVC時(shí)代 (web端主流框架,大部分移動(dòng)端系統(tǒng)的默認(rèn)架構(gòu))

MVC的到來(lái)女仰,就是為了解決邏輯混雜的問(wèn)題猜年,從而將頁(yè)面簡(jiǎn)單的進(jìn)行功能劃分,M負(fù)責(zé)處理業(yè)務(wù)疾忍,V負(fù)責(zé)顯示乔外,C負(fù)責(zé)設(shè)置V顯示內(nèi)容,響應(yīng)V事件并調(diào)用M處理一罩,MVC最明顯的優(yōu)點(diǎn)是杨幼,M的開(kāi)發(fā)完全獨(dú)立,不再需要考慮頁(yè)面如何顯示聂渊,而是直接的面相業(yè)務(wù)邏輯差购,V的開(kāi)發(fā)也不需要考慮業(yè)務(wù)需要顯示什么模型,而是直接面對(duì)顯示結(jié)果 </br>
這是一個(gè)基礎(chǔ)的MVC結(jié)構(gòu)顯示

MVC.jpg

MVC只是對(duì)原有頁(yè)面的簡(jiǎn)單拆分,所以汉嗽,還是存在部分問(wèn)題的
在這個(gè)簡(jiǎn)單的MVC例子歹撒,短短的40多行代碼中,混合了事件綁定诊胞,業(yè)務(wù),UI顯示操作锹杈,動(dòng)畫(huà)撵孤,一旦頁(yè)面邏輯稍微復(fù)雜,C就會(huì)嚴(yán)重膨脹竭望,影響編寫(xiě)與閱讀

MVC_Comment.jpg

</br>

MVP時(shí)代

為了解決MVC遇到的問(wèn)題邪码,MVP(Model - View - Presenter)隨之出現(xiàn),MVP中的V是大V咬清,順序不是MVP闭专,嚴(yán)格來(lái)說(shuō)奴潘,MVP應(yīng)該叫(Model - Presenter - Controller - View),他將頁(yè)面的業(yè)務(wù)邏輯從C中拆分出來(lái)影钉,放入P中画髓,從而達(dá)到獨(dú)立頁(yè)面邏輯,最終達(dá)到頁(yè)面顯示/頁(yè)面邏輯都可以單獨(dú)測(cè)試的效果
經(jīng)過(guò)拆分后平委,P在編寫(xiě)的時(shí)候已不需要考慮V具體怎么實(shí)現(xiàn)奈虾,只需要關(guān)心響應(yīng)什么事件,向V提供什么模型
而VC也只需要關(guān)心模型怎么展現(xiàn)廉赔,在什么位置響應(yīng)用戶(hù)的操作
還是同樣的例子肉微,但是把業(yè)務(wù)拆分到Presenter

MVP_Activity_Comment.jpg
MVP_Presenter.jpg

但MVP也不是沒(méi)有缺點(diǎn)的,試想一下這種情況,我們現(xiàn)在需要顯示一個(gè)列表,我們使用一個(gè)為Activity增加了一個(gè)Adapter顯示這個(gè)列表

MVP_Weakness_Adapter.jpg

這時(shí)候蜡塌,產(chǎn)品說(shuō)我們需要增加一個(gè)昵稱(chēng)碉纳,這個(gè)昵稱(chēng)從另一個(gè)服務(wù)獲得,我們來(lái)看看這時(shí)候我們需要改動(dòng)什么馏艾,我們需要在頂層View(也就是Activity)上增加一個(gè)回調(diào)劳曹,

MVP_Weakness_Add_Field_Activity.jpg

接著,我們需要在Adapter上增加一個(gè)方法攒至,刷新全部

MVP_Weakness_Add_Field_Adapter.jpg

這時(shí)候我們思考下厚者,

  1. 我們只是要在列表的單項(xiàng)里面增加一個(gè)顯示內(nèi)容,但我們卻需要在他的父層級(jí)改動(dòng)
    2.我們改動(dòng)的是item迫吐,卻不得不刷新整個(gè)列表

對(duì)MVP的Presenter來(lái)說(shuō)库菲,View是單一的,意味著模型只能夠傳遞到最頂層的View志膀,再由頂層View逐級(jí)下發(fā)熙宇,一旦傳遞的模型增加,傳遞的層級(jí)加深溉浙,這部分就內(nèi)容就非常容易膨脹烫止,那如果底層的View能直接從P那邊得到數(shù)據(jù)呢?MVVM的出現(xiàn)就是為了解決這么一個(gè)問(wèn)題

</br>

MVVM時(shí)代

MVVM是一個(gè)基于模型綁定的框架戳稽。通過(guò)在V上增加對(duì)VM的監(jiān)聽(tīng)馆蠕,使P對(duì)VM的修改直接反應(yīng)到V上,從而避免P的每一次修改都需要從主View逐級(jí)傳遞到子View上惊奇。
MVVM的V跟MVP一樣也是大V互躬,包含Controller和View,網(wǎng)上有些Demo把業(yè)務(wù)也集合進(jìn)VM颂郎,但這里為了邏輯清晰吼渡,并且方便測(cè)試,我們將VM也業(yè)務(wù)獨(dú)立出來(lái)乓序,也就是把P獨(dú)立出來(lái)寺酪,所以坎背,整個(gè)框架應(yīng)該是 M(P)VM(C)V
我們?cè)贏ctivity初始化的時(shí)候構(gòu)造一個(gè)ViewModel,Present則由ViewModel來(lái)構(gòu)造(為了使View對(duì)業(yè)務(wù)透明)寄雀,ViewModel向View提供顯示需要的業(yè)務(wù)模型得滤。而對(duì)于底層的View來(lái)說(shuō),只需要傳入一個(gè)ViewModel咙俩,接下來(lái)他的所有顯示就與上層View無(wú)關(guān)了耿戚。ViewModel的任何改動(dòng),不再需要頂層View介入阿趁,就能傳遞到底層了

在Activity中構(gòu)造ViewModel
將ViewModel傳入Adapter
Adapter自行對(duì)ViewModel實(shí)現(xiàn)監(jiān)聽(tīng)

經(jīng)過(guò)MVVM改造后膜蛔,頂層View只有在構(gòu)造的時(shí)候需要傳入ViewModel,其他任何時(shí)候脖阵,底層View都能直接通過(guò)ViewModel獲得自己要顯示的內(nèi)容皂股,每一個(gè)底層View都是最小單元的MVC,具體底層View怎么顯示已經(jīng)與他的上層沒(méi)有任何關(guān)系命黔,ViewModel增加Field也不再需要通過(guò)頂層View傳遞進(jìn)來(lái)呜呐,下層View能直接通過(guò)ViewModel獲得

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悍募,隨后出現(xiàn)的幾起案子蘑辑,更是在濱河造成了極大的恐慌,老刑警劉巖坠宴,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洋魂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喜鼓,警方通過(guò)查閱死者的電腦和手機(jī)副砍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庄岖,“玉大人豁翎,你說(shuō)我怎么就攤上這事∮绶蓿” “怎么了心剥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)背桐。 經(jīng)常有香客問(wèn)我刘陶,道長(zhǎng),這世上最難降的妖魔是什么牢撼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疑苫,結(jié)果婚禮上熏版,老公的妹妹穿的比我還像新娘纷责。我一直安慰自己,他們只是感情好撼短,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布再膳。 她就那樣靜靜地躺著,像睡著了一般曲横。 火紅的嫁衣襯著肌膚如雪喂柒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天禾嫉,我揣著相機(jī)與錄音灾杰,去河邊找鬼。 笑死熙参,一個(gè)胖子當(dāng)著我的面吹牛艳吠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孽椰,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昭娩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了黍匾?” 一聲冷哼從身側(cè)響起栏渺,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锐涯,沒(méi)想到半個(gè)月后磕诊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡全庸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年秀仲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壶笼。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡神僵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出覆劈,到底是詐尸還是另有隱情保礼,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布责语,位于F島的核電站炮障,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坤候。R本人自食惡果不足惜胁赢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望白筹。 院中可真熱鬧智末,春花似錦谅摄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至由蘑,卻和暖如春闽寡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尼酿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工爷狈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谓媒。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓淆院,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親句惯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子土辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容