MVC宰翅,MVP和MVVM的理解弃甥?

web1.0時代

在web1.0時代并沒有前端的概念,開發(fā)一個web應用多數(shù)采用ASP.NET/Java/PHP編寫汁讼,項目通常有多個aspx/jsp/php文件構(gòu)成淆攻,每個文件中同時包含了HTML、CSS嘿架、Javascript瓶珊、C#/Java/PHP代碼,系統(tǒng)整體架構(gòu)可能是這個樣子:


a1646e1f0ae31ce50b53c84d07908ad.png

這種架構(gòu)的好處是簡單快捷耸彪,但是缺點也非常明顯:JSP代碼難以維護
為了讓開發(fā)更加快捷伞芹,代碼更易維護,前后端職責更清晰蝉娜。便衍生出MVC開發(fā)模式和框架唱较,前端展示以模版的形式出現(xiàn)。典型的框架就是Spring召川、Structs南缓、Hibernte。整體框架如圖所示:


13777cc65630f8f832112781dca40e4.png

使用這種分層結(jié)構(gòu)荧呐,職責清晰西乖,代碼易維護。但這里的MVC僅限于后端坛增,前后端形成了一定的分離获雕,前端只完成了后端開發(fā)中的view層。
但是收捣,同樣的這種模式存在著一些:

1.前端頁面開發(fā)效率不高
2.前后端職責不清

web2.0時代

自從Gmail的出現(xiàn)届案,ajax技術(shù)開始風靡全球,有了ajax之后罢艾,前后端的職責就更加清晰了楣颠,因為前端可以通過ajax與后端進行數(shù)據(jù)交互,因此咐蚯,整體的架構(gòu)圖也變化成了下面這幅圖:


31e8e80ce3b07fe1069512a5400c9cd.png

通過ajax與后臺服務(wù)器進行數(shù)據(jù)交互童漩,前端開發(fā)人員,只需要開發(fā)頁面這部分內(nèi)容,數(shù)據(jù)可由后臺進行提供。而且ajax可以使得頁面實現(xiàn)部分刷新翅娶,減少了服務(wù)端負載和流量消耗等限,用戶體驗也更佳。這時制市,才開始有專職的前端工程師示损。同時前端的類庫也開始慢慢的發(fā)展朗和,最著名的就是JQuery了馁痴。

當然此架構(gòu)也存在問題:缺乏可行的開發(fā)模式承載更復雜的業(yè)務(wù)需求谊娇,頁面內(nèi)容都糅雜在一起,一旦應用規(guī)模增大罗晕,就會導致難以維護了济欢。因此前端的MVC也隨之而來。

前后端分離的架構(gòu)演變 -- MVC小渊、MVP和MVVM

MVC

前端的MVC與后端類似船逮,具備著View,Controller和Model粤铭。
Model:負責保存應用數(shù)據(jù),與后端數(shù)據(jù)進行同步
Controller:負責業(yè)務(wù)邏輯杂靶,根據(jù)用戶行為對Model數(shù)據(jù)進行修改
View:負責視圖展示梆惯,將Model中的數(shù)據(jù)可視化出來
三者形成了一個如圖所示的模型:


_20200407212732.png

這樣的模型,在理論上是可行的吗垮。但往往在實際開發(fā)中垛吗,并不會這樣操作。因為開發(fā)過程并不靈活烁登。例如怯屉,一個小小的事件操作,都必須經(jīng)過這樣一個流程饵沧,那么開發(fā)就不在便捷了锨络。
在實際場景中,我們往往會看到另一種模式狼牺,如圖:


_20200407213532.png

這種模式在開發(fā)中更加靈活羡儿,backbone.js框架就是這種模式。
但是是钥,這種靈活可能導致嚴重的問題:
1.數(shù)據(jù)流混亂掠归。如下圖:
_20200407213909.png

2.view比較龐大,而controller比較單鼻哪唷:由于很多的開發(fā)者都會在view中寫一些邏輯代碼虏冻,逐漸就導致view中的代碼越來越龐大,而controller變的越來越單薄弹囚。
既然有缺陷厨相,就會有變革。前端的變化中似乎少了MVP這種模式,是因為angular早早的將MVVM這種模式帶入了前端领铐。MVP模式雖然前端開發(fā)并不常見悯森,但是在安卓等原生開發(fā)中,開發(fā)者還是會考慮到它绪撵。

MVP

MVP與MVC很接近瓢姻,P指的是Presenter,Presenter可以理解為一個中間人音诈,它負責這View和Model之間的數(shù)據(jù)流動幻碱,防止View和Model之間的直接交流。我們可以看下圖示:


_20200407215232.png

我們可以通過看到细溅,presenter負責和Model進行雙向交互褥傍,還和View進行雙向交互,相對于MVC來說喇聊,少了一些靈活恍风,View變成了被動視圖,并且本身變得很小誓篱,雖然它分離了View和Model朋贬。但是應用逐漸變大之后,導致presenter的體積增大窜骄,難以維護锦募。要解決這個問題,或許可以從MVVM的思想中找到答案邻遏。

MVVM

首先糠亩,何為MVVM呢?MVVM可以分解成為(Model-View-ViewModel)准验∈晗撸可以理解為在presenter上的進階版。如圖所示:


_20200407220845.png

ViewModel通過實現(xiàn)一套數(shù)據(jù)響應式機制自動響應Model中數(shù)據(jù)變化糊饱;
同時ViewModel會實現(xiàn)一套更新策略自動將數(shù)據(jù)變化轉(zhuǎn)換為視圖更新氛驮;
通過事件監(jiān)聽響應View中用戶交互修改Model中數(shù)據(jù)。
這樣在ViewModel中就減少了大量DOM操作代碼济似。
MVVM在保持View和Model松耦合的同時矫废,還減少了維護它們關(guān)系的代碼,使用戶專注于業(yè)務(wù)邏輯砰蠢,兼顧開發(fā)效率和可維護性蓖扑。

總結(jié):

1.這三者都是框架模式,它們的設(shè)計目標都是為了解決Model和View的耦合問題台舱。
2.MVC模式出現(xiàn)較早主要應用在后端律杠,如Spring MVC潭流、ASP.NET MVC等,在前端領(lǐng)域的早期也有應用如backbone.js柜去。它的優(yōu)點是分層清晰灰嫉,缺點是數(shù)據(jù)流混亂,靈活性帶來的維護性問題嗓奢。
3.MVP模式在是MVC的進化形式presenter作為中間層負責MV通信讼撒,解決了兩者耦合問題,但P層過于臃腫導致維護問題股耽。
4.MVVM模式在前端領(lǐng)域有廣泛應用根盒,它不僅解決了MV耦合問題,還同時解決了維護兩者映射關(guān)系的大量繁雜代碼和DOM操作代碼物蝙,在提高開發(fā)效率炎滞,可讀性同時還保持了優(yōu)越的性能表現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诬乞,一起剝皮案震驚了整個濱河市册赛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震嫉,老刑警劉巖森瘪,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異责掏,居然都是意外死亡,警方通過查閱死者的電腦和手機湃望,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門换衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人证芭,你說我怎么就攤上這事瞳浦。” “怎么了废士?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵叫潦,是天一觀的道長。 經(jīng)常有香客問我官硝,道長矗蕊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任氢架,我火速辦了婚禮傻咖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岖研。我一直安慰自己卿操,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著害淤,像睡著了一般扇雕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窥摄,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天镶奉,我揣著相機與錄音,去河邊找鬼溪王。 笑死腮鞍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的莹菱。 我是一名探鬼主播移国,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼道伟!你這毒婦竟也來了迹缀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜜徽,失蹤者是張志新(化名)和其女友劉穎祝懂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拘鞋,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡砚蓬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盆色。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灰蛙。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隔躲,靈堂內(nèi)的尸體忽然破棺而出摩梧,到底是詐尸還是另有隱情,我是刑警寧澤宣旱,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布仅父,位于F島的核電站,受9級特大地震影響浑吟,放射性物質(zhì)發(fā)生泄漏笙纤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一组力、第九天 我趴在偏房一處隱蔽的房頂上張望粪糙。 院中可真熱鬧,春花似錦忿项、人聲如沸蓉冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞酿。三九已至家夺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伐弹,已是汗流浹背拉馋。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惨好,地道東北人煌茴。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像日川,于是被迫代替她去往敵國和親蔓腐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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