浅谈MVP与Model-View-ViewModel(MVVM)设计模式
生活随笔
收集整理的這篇文章主要介紹了
浅谈MVP与Model-View-ViewModel(MVVM)设计模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?微軟的WPF帶來了新的技術(shù)體驗(yàn),如Sliverlight、音頻、視頻、3D、動畫……,這導(dǎo)致了軟件UI層更加細(xì)節(jié)化、可定制化。同時,在技術(shù)層面,WPF也帶來了諸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由來便是MVP(Model-View-Presenter)模式與WPF結(jié)合的應(yīng)用方式時發(fā)展演變過來的一種新型架構(gòu)框架。它立足于原有MVP框架并且把WPF的新特性揉合進(jìn)去,以應(yīng)對客戶日益復(fù)雜的需求變化。 WPF的數(shù)據(jù)綁定與Presentation Model相集合是非常好的做法,使得開發(fā)人員可以將View和邏輯分離出來,但這種數(shù)據(jù)綁定技術(shù)非常簡單實(shí)用,也是WPF所特有的,所以我們又稱之為Model-View-ViewModel (MVVM)。這種模式跟經(jīng)典的MVP(Model-View-Presenter)模式很相似,除了你需要一個為View量身定制的model,這個model就是ViewModel。ViewModel包含所有由UI特定的接口和屬性,并由一個ViewModel 的視圖的綁定屬性,并可獲得二者之間的松散耦合,所以需要在ViewModel 直接更新視圖中編寫相應(yīng)代碼。數(shù)據(jù)綁定系統(tǒng)還支持提供了標(biāo)準(zhǔn)化的方式傳輸?shù)揭晥D的驗(yàn)證錯誤的輸入的驗(yàn)證。 如下圖MVP設(shè)計模式架構(gòu)所示。
? 在視圖(View)部分,通常也就是一個Aspx頁面。在以前設(shè)計模式中由于沒有清晰的職責(zé)劃分,UI 層經(jīng)常成為邏輯層的全能代理,而后者實(shí)際上屬于應(yīng)用程序的其他層。MVP 里的M 其實(shí)和MVC里的M是一個,都是封裝了核心數(shù)據(jù)、邏輯和功能的計算關(guān)系的模型,而V是視圖(窗體),P就是封裝了窗體中的所有操作、響應(yīng)用戶的輸入輸出、事件等,與MVC里的C差不多,區(qū)別是MVC是系統(tǒng)級架構(gòu)的,MVP是用在某個特定頁面上的,也就是說MVP的靈活性要遠(yuǎn)遠(yuǎn)大于MVC ,實(shí)現(xiàn)起來也極為簡單。 我們再從IView這個interface層來解析,它可以幫助我們把各類UI與邏輯層解耦,同時可以從UI層進(jìn)入自動化測試自動化測試(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)行時UI層顯示恰當(dāng)?shù)臄?shù)據(jù)。比如Binding,在程序中,你可能看到Binding的Source是某個interface類型的變量,實(shí)際上,這個interface變量引用著的對象才是真正的數(shù)據(jù)源。 MVC模式大家都已經(jīng)非常熟悉了,在這里我就不贅述,這些模式也是依次進(jìn)化而形成MVC—>MVP—>MVVM。有一句話說的好:當(dāng)物體受到接力的時候,凡是有 界面的地方就是最容易被撕下來的地方。因此,IView作為公共視圖接口約束(契約)的一層意思;View則能傳達(dá)解耦的一層意思。 下面介紹一下MVVM設(shè)計模式。因?yàn)閃PF技術(shù)出現(xiàn),從而使MVP設(shè)計模式有所改進(jìn),MVVM 模式便是使用的是數(shù)據(jù)綁定基礎(chǔ)架構(gòu)。它們可以輕松構(gòu)建UI的必要元素。 如,下圖所示MVVM架構(gòu)圖。?
可以參考The Composite Application Guidance for WPF(prism),prism V2下載源碼
View綁定到ViewModel,然后執(zhí)行一些命令在向它請求一個動作。而反過來,ViewModel跟Model通訊,告訴它更新來響應(yīng)UI。這樣便使得為應(yīng)用構(gòu)建UI非常的容易。往一個應(yīng)用程序上貼一個界面越容易,外觀設(shè)計師就越容易使用Blend來創(chuàng)建一個漂亮的界面。同時,當(dāng)UI和功能越來越松耦合的時候,功能的可測試性就越來越強(qiáng)。 在MVP模式中,為了讓UI層能夠從邏輯層上分離下來,設(shè)計師們在UI層與邏輯層之間加了一層interface。無論是UI開發(fā)人員還是數(shù)據(jù)開發(fā)人員,都要尊重這個契約、按照它進(jìn)行設(shè)計和開發(fā)。這樣,理想狀態(tài)下無論是Web UI還是Window UI就都可以使用同一套數(shù)據(jù)邏輯了。借鑒MVP的IView層,養(yǎng)成習(xí)慣。View Model聽起來Presenter要貼切得多;會把一些跟事件、命令相關(guān)的東西放在Controler里。 參考示例:PersonViewModel層 public?FamilyTreeViewModel(Person?rootPerson)
{
????_rootPerson?=?new?PersonViewModel(rootPerson);
????_firstGeneration?=?new?ReadOnlyCollection<PersonViewModel>(
????????new?PersonViewModel[]?
????????{?
????????????_rootPerson?
????????});
????_searchCommand?=?new?SearchFamilyTreeCommand(this);
}
在這里我不在贅述,詳細(xì)應(yīng)用實(shí)例參考: Simplifying the WPF TreeView by Using the ViewModel Pattern 源碼下載
本文轉(zhuǎn)自?高陽?51CTO博客,原文鏈接:http://blog.51cto.com/xiaoyinnet/196071?,如需轉(zhuǎn)載請自行聯(lián)系原作者
? 在視圖(View)部分,通常也就是一個Aspx頁面。在以前設(shè)計模式中由于沒有清晰的職責(zé)劃分,UI 層經(jīng)常成為邏輯層的全能代理,而后者實(shí)際上屬于應(yīng)用程序的其他層。MVP 里的M 其實(shí)和MVC里的M是一個,都是封裝了核心數(shù)據(jù)、邏輯和功能的計算關(guān)系的模型,而V是視圖(窗體),P就是封裝了窗體中的所有操作、響應(yīng)用戶的輸入輸出、事件等,與MVC里的C差不多,區(qū)別是MVC是系統(tǒng)級架構(gòu)的,MVP是用在某個特定頁面上的,也就是說MVP的靈活性要遠(yuǎn)遠(yuǎn)大于MVC ,實(shí)現(xiàn)起來也極為簡單。 我們再從IView這個interface層來解析,它可以幫助我們把各類UI與邏輯層解耦,同時可以從UI層進(jìn)入自動化測試自動化測試(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)行時UI層顯示恰當(dāng)?shù)臄?shù)據(jù)。比如Binding,在程序中,你可能看到Binding的Source是某個interface類型的變量,實(shí)際上,這個interface變量引用著的對象才是真正的數(shù)據(jù)源。 MVC模式大家都已經(jīng)非常熟悉了,在這里我就不贅述,這些模式也是依次進(jìn)化而形成MVC—>MVP—>MVVM。有一句話說的好:當(dāng)物體受到接力的時候,凡是有 界面的地方就是最容易被撕下來的地方。因此,IView作為公共視圖接口約束(契約)的一層意思;View則能傳達(dá)解耦的一層意思。 下面介紹一下MVVM設(shè)計模式。因?yàn)閃PF技術(shù)出現(xiàn),從而使MVP設(shè)計模式有所改進(jìn),MVVM 模式便是使用的是數(shù)據(jù)綁定基礎(chǔ)架構(gòu)。它們可以輕松構(gòu)建UI的必要元素。 如,下圖所示MVVM架構(gòu)圖。?
可以參考The Composite Application Guidance for WPF(prism),prism V2下載源碼
View綁定到ViewModel,然后執(zhí)行一些命令在向它請求一個動作。而反過來,ViewModel跟Model通訊,告訴它更新來響應(yīng)UI。這樣便使得為應(yīng)用構(gòu)建UI非常的容易。往一個應(yīng)用程序上貼一個界面越容易,外觀設(shè)計師就越容易使用Blend來創(chuàng)建一個漂亮的界面。同時,當(dāng)UI和功能越來越松耦合的時候,功能的可測試性就越來越強(qiáng)。 在MVP模式中,為了讓UI層能夠從邏輯層上分離下來,設(shè)計師們在UI層與邏輯層之間加了一層interface。無論是UI開發(fā)人員還是數(shù)據(jù)開發(fā)人員,都要尊重這個契約、按照它進(jìn)行設(shè)計和開發(fā)。這樣,理想狀態(tài)下無論是Web UI還是Window UI就都可以使用同一套數(shù)據(jù)邏輯了。借鑒MVP的IView層,養(yǎng)成習(xí)慣。View Model聽起來Presenter要貼切得多;會把一些跟事件、命令相關(guān)的東西放在Controler里。 參考示例:PersonViewModel層 public?FamilyTreeViewModel(Person?rootPerson)
{
????_rootPerson?=?new?PersonViewModel(rootPerson);
????_firstGeneration?=?new?ReadOnlyCollection<PersonViewModel>(
????????new?PersonViewModel[]?
????????{?
????????????_rootPerson?
????????});
????_searchCommand?=?new?SearchFamilyTreeCommand(this);
}
在這里我不在贅述,詳細(xì)應(yīng)用實(shí)例參考: Simplifying the WPF TreeView by Using the ViewModel Pattern 源碼下載
本文轉(zhuǎn)自?高陽?51CTO博客,原文鏈接:http://blog.51cto.com/xiaoyinnet/196071?,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的浅谈MVP与Model-View-ViewModel(MVVM)设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由SpringMVC中RequetCon
- 下一篇: 推荐一个比FiddlerCore好用的H