MVVM的發(fā)展歷程:MVC-->MVP-->MVVM。
MVVM是Model-View-ViewModel的簡(jiǎn)寫绞蹦。微軟的WPF帶來了新的技術(shù)體驗(yàn)力奋,如Silverlight、音頻幽七、視頻景殷、3D、動(dòng)畫……澡屡,這導(dǎo)致了軟件UI層更加細(xì)節(jié)化猿挚、可定制化。同時(shí)驶鹉,在技術(shù)層面绩蜻,WPF也帶來了 諸如Binding、Dependency Property室埋、Routed Events办绝、Command、DataTemplate词顾、ControlTemplate等新特性八秃。MVVM(Model-View-ViewModel)框架的由來便是MVP(Model-View-Presenter)模式與WPF結(jié)合的應(yīng)用方式時(shí)發(fā)展演變過來的一種新型架構(gòu)框架。它立足于原有MVP框架并且把WPF的新特性糅合進(jìn)去肉盹,以應(yīng)對(duì)客戶日益復(fù)雜的需求變化昔驱。
因?yàn)閃PF技術(shù)出現(xiàn),從而使MVP設(shè)計(jì)模式有所改進(jìn)上忍,MVVM 模式便是使用的是數(shù)據(jù)綁定基礎(chǔ)架構(gòu)骤肛。它們可以輕松構(gòu)建UI的必要元素。
View綁定到ViewModel窍蓝,然后執(zhí)行一些命令在向它請(qǐng)求一個(gè)動(dòng)作腋颠。而反過來,ViewModel跟Model通訊吓笙,告訴它更新來響應(yīng)UI淑玫。這樣便使得為應(yīng)用構(gòu)建UI非常的容易。往一個(gè)應(yīng)用程序上貼一個(gè)界面越容易面睛,外觀設(shè)計(jì)師就越容易使用Blend來創(chuàng)建一個(gè)漂亮的界面絮蒿。同時(shí),當(dāng)UI和功能越來越松耦合的時(shí)候叁鉴,功能的可測(cè)試性就越來越強(qiáng)土涝。
在MVP模式中,為了讓UI層能夠從邏輯層上分離下來幌墓,設(shè)計(jì)師們?cè)赨I層與邏輯層之間加了一層interface但壮。無論是UI開發(fā)人員還是數(shù)據(jù)開發(fā)人員冀泻,都要尊重這個(gè)契約、按照它進(jìn)行設(shè)計(jì)和開發(fā)蜡饵。這樣弹渔,理想狀態(tài)下無論是Web UI還是Window UI就都可以使用同一套數(shù)據(jù)邏輯了。借鑒MVP的IView層验残,養(yǎng)成習(xí)慣捞附。View Model聽起來比Presenter要貼切得多;會(huì)把一些跟事件您没、命令相關(guān)的東西放在MVC的'C',或者是MVVM的'Vm'。
優(yōu)點(diǎn):
MVVM模式和MVC模式一樣胆绊,主要目的是分離視圖(View)和模型(Model)氨鹏,有幾大優(yōu)點(diǎn)
1. 低耦合。視圖(View)可以獨(dú)立于Model變化和修改压状,一個(gè)ViewModel可以綁定到不同的"View"上仆抵,當(dāng)View變化的時(shí)候Model可以不變,當(dāng)Model變化的時(shí)候View也可以不變种冬。
2. 可重用性镣丑。你可以把一些視圖邏輯放在一個(gè)ViewModel里面,讓很多view重用這段視圖邏輯娱两。
3. 獨(dú)立開發(fā)莺匠。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計(jì)人員可以專注于頁面設(shè)計(jì)十兢,使用Expression Blend可以很容易設(shè)計(jì)界面并生成xaml代碼趣竣。
4. 可測(cè)試。界面素來是比較難于測(cè)試的旱物,而現(xiàn)在測(cè)試可以針對(duì)ViewModel來寫遥缕。
解析:
WPF的數(shù)據(jù)綁定與Presentation Model相結(jié)合是非常好的做法,使得開發(fā)人員可以將
MVVM 功能圖
View和邏輯分離出來,但這種數(shù)據(jù)綁定技術(shù)非常簡(jiǎn)單實(shí)用,也是WPF所特有的宵呛,所以我們又稱之為Model-View-ViewModel(MVVM)单匣。這種模式跟經(jīng)典的MVP(Model-View-Presenter)模式很相似,除了你需要一個(gè)為View量身定制的model宝穗,這個(gè)model就是ViewModel户秤。ViewModel包含所有由UI特定的接口和屬性,并由一個(gè) ViewModel 的視圖的綁定屬性讽营,并可獲得二者之間的松散耦合虎忌,所以需要在ViewModel 直接更新視圖中編寫相應(yīng)代碼。數(shù)據(jù)綁定系統(tǒng)還支持提供了標(biāo)準(zhǔn)化的方式傳輸?shù)揭晥D的驗(yàn)證錯(cuò)誤的輸入的驗(yàn)證橱鹏。
在視圖(View)部分膜蠢,通常也就是一個(gè)Aspx頁面堪藐。在以前設(shè)計(jì)模式中由于沒有清晰的職責(zé)劃分,UI 層經(jīng)常成為邏輯層的全能代理挑围,而后者實(shí)際上屬于應(yīng)用程序的其他層礁竞。MVP 里的M 其實(shí)和MVC里的M是一個(gè),都是封裝了核心數(shù)據(jù)杉辙、邏輯和功能的計(jì)算關(guān)系的模型模捂,而V是視圖(窗體),P就是封裝了窗體中的所有操作蜘矢、響應(yīng)用戶的輸入輸出狂男、事件等,與MVC里的C差不多品腹,區(qū)別是MVC是系統(tǒng)級(jí)架構(gòu)的岖食,而MVP是用在某個(gè)特定頁面上的,也就是說MVP的靈活性要遠(yuǎn)遠(yuǎn)大于MVC舞吭,實(shí)現(xiàn)起來也極為簡(jiǎn)單泡垃。
我們?cè)購腎View這個(gè)interface層來解析,它可以幫助我們把各類UI與邏輯層解耦羡鸥,同時(shí)可以從UI層進(jìn)入自動(dòng)化測(cè)試(Unit/Automatic Test)并提供了入口蔑穴,在以前可以由WinForm/Web Form/MFC等編寫的UI是通過事件Windows消息與IView層溝通的。WPF與IView層的溝通惧浴,最佳的手段是使用Binding存和,當(dāng)然,也可以使用事件赶舆;Presenter層要實(shí)現(xiàn)IView哑姚,多態(tài)機(jī)制可以保證運(yùn)行時(shí)UI層顯示恰當(dāng)?shù)臄?shù)據(jù)。比如Binding芜茵,在程序中叙量,你可能看到Binding的Source是某個(gè)interface類型的變量,實(shí)際上九串,這個(gè)interface變量引用著的對(duì)象才是真正的數(shù)據(jù)源绞佩。
MVC模式大家都已經(jīng)非常熟悉了,在這里我就不贅述猪钮,這些模式也是依次進(jìn)化而形成MVC—>MVP—>MVVM品山。有一句話說的好:當(dāng)物體受到接力的時(shí)候,凡是有界面的地方就是最容易被撕下來的地方烤低。因此肘交,IView作為公共視圖接口約束(契約)的一層意思;View則能傳達(dá)解耦的一層意思扑馁。