展示模式架構(gòu)比較MVP(SC)匾效,MVP(PV),PM恤磷,MVVM和MVC
介紹
本文將比較4重重要的展示模式架構(gòu)面哼,包括MVP(SC)野宜,MVP(PV),PM魔策,MVVM和MVC匈子。很多開發(fā)者圍繞著這些模式間有什么不同及何時(shí)用哪種模式而感到困惑。本文將首先介紹背景之后解釋不同的展示模式闯袒。接著我們將進(jìn)一步討論狀態(tài)虎敦,邏輯和同步問題。最后我們將深入每種模式并總結(jié)它們之間的不同政敢。
這里是對(duì)我的.NET朋友的小禮物其徙,400頁的FAQ電子書,包含各種.NET技術(shù)喷户,例如Azure唾那,WCF,WWF褪尝,Silverlight通贞,WPF,SharePoint和其他恼五。
全文是從http://martinfowler.com/eaaDev/uiArchs.htmlGUI架構(gòu)的摘要。Mr. Martin flower的偉大工作哭懈。
Josh Smith和團(tuán)隊(duì)http://msdn.microsoft.com/en-us/magazine/dd419663.aspx灾馒,關(guān)于MVVM的偉大工作。
Mr. Mikhil kothari的博客http://msdn.microsoft.com/en-us/magazine/dd419663.aspx遣总,關(guān)于MVVM的帥代碼睬罗。
Mr. Oleg Zhukov解釋了如何實(shí)現(xiàn)一個(gè).NET的MVP框架,http://www.codeproject.com/KB/architecture/DotNetMVPFramework_Part1.aspx旭斥。
與用戶界面相關(guān)的一個(gè)最大問題是大量雜亂的代碼容达。這種混亂代碼由于兩個(gè)主要原因,首先是UI有復(fù)雜的邏輯來操作用戶界面對(duì)象垂券,花盐,第二它還維護(hù)應(yīng)用的狀態(tài)。展示模式解決了圍繞著如何刪除UI的復(fù)雜性和是的UI更簡潔和可管理的問題菇爪。下面是展示模式不同的變種和分類:
展示模式主要分為三類MVP(Model View Presenter)算芯,MVC(Model View Controller)和最后的PM(Presenter Model)。MVP進(jìn)一步分為監(jiān)督控制器和被動(dòng)視圖凳宙。PM進(jìn)一步被微軟團(tuán)隊(duì)分成兩個(gè)技術(shù)特定模式Sliverlight的MVVM和WPF的MVVM熙揍。
下面列出了UI相關(guān)的三大問題氏涩。
狀態(tài):狀態(tài)/數(shù)據(jù)是UI最大擔(dān)憂之一届囚。狀體意味著UI的當(dāng)前數(shù)據(jù)展示有梆。在Web術(shù)語里它可以是會(huì)話變量,而在Windows應(yīng)用中它可以是簡單地UI級(jí)數(shù)據(jù)意系。UI保持的狀態(tài)越多泥耀,復(fù)雜性也越高。
邏輯:UI通常有UI邏輯昔字,例如操作文本框爆袍,組合框或其他UI組件。在UI中作郭,越多的這種邏輯存在陨囊,它就越復(fù)雜。
同步:UI通常要協(xié)調(diào)域/業(yè)務(wù)組件夹攒。UI還需要同步UI元素(文本框蜘醋,組合框等)和業(yè)務(wù)對(duì)象間的數(shù)據(jù)。如果你的UI重復(fù)進(jìn)行同步咏尝,那么UI的復(fù)雜性就大大增加压语。
展示設(shè)計(jì)模式幫舉解決以上的UI問題。程序設(shè)計(jì)模式的基本邏輯是創(chuàng)建附加類编检,該類處理當(dāng)前UI需要處理的復(fù)雜邏輯胎食,數(shù)據(jù)和同步問題,使得UI轉(zhuǎn)嫁責(zé)任允懂,更簡潔和簡單厕怜。取決于這個(gè)類負(fù)責(zé)的職責(zé),進(jìn)一步定義為它為SC蕾总,PV粥航,PM設(shè)計(jì)模式等等。換句話說生百,展示類的成熟度決定了它是哪種設(shè)計(jì)模式递雀。
縮寫全稱
V視圖或UI(View or UI)
P包含UI邏輯的展示器類(Presenter class which has the UI logic)
LUI邏輯(UI logic)
SUI的狀態(tài)(State of the UI)
M業(yè)務(wù)組件或域?qū)ο?Bissiness components or domain objects)
SC監(jiān)督控制器(Supervising controller)
PV被動(dòng)視圖(Passive view)
PV展示器模型(Presenter model)
我們使用以上縮寫來簡化展示設(shè)計(jì)模式的解釋。
SC的基礎(chǔ):
狀態(tài)存儲(chǔ)在視圖里蚀浆。
展示器包含復(fù)雜的展示邏輯缀程。簡單的UI綁定邏輯通過使用綁定技術(shù)來完成,例如WIF綁定和Silverlight綁定蜡坊。任何復(fù)雜性有展示器類處理杠输。
展示器知道視圖。
視圖不知道知道展示器秕衙。
視圖使用由WPF和Silverlight提供的綁定技術(shù)與模型鏈接蠢甲。
PV的基礎(chǔ):
狀態(tài)存儲(chǔ)在視圖里。
所有UI邏輯存儲(chǔ)在展示器里据忘。
視圖與模型完全隔離鹦牛。它還處理模型和視圖見額外的同步任務(wù)搞糕。
展示器知道視圖
視圖不知道展示器。
你可以從這里知道更多關(guān)于MVP(PV)的知識(shí)曼追,它還有一個(gè)樣例代碼窍仰,展示了MVP如何進(jìn)入行動(dòng)鏈的。
PM的基礎(chǔ):
狀態(tài)儲(chǔ)存在展示器里礼殊。
邏輯存儲(chǔ)在展示器里驹吮。
展示器代編一個(gè)抽象的UI視圖。
展示器不知道視圖
視圖知道展示器晶伦。
視圖與模型完全隔離碟狞。
MVVM的基礎(chǔ):
展示器模型是基礎(chǔ)。
狀態(tài)儲(chǔ)存在展示器里婚陪。
邏輯存儲(chǔ)在展示器里族沃。
展示器代表一個(gè)UI的抽像視圖。
展示器不知道視圖泌参。
視圖知道展示器脆淹。
視圖與模型完全隔離。
使用WPF和Silverlight綁定沽一。
MVC的基礎(chǔ):
沒有展示器盖溺,有一個(gè)控制器。
請求首先到達(dá)控制器铣缠。
控制器綁定模型和視圖咐柜。
邏輯存儲(chǔ)在控制器里。
你可以從這里知道更多MVC的知識(shí)攘残,它還有一個(gè)樣例代碼,展示了MVC如何處理行動(dòng)鏈为狸。
下面是對(duì)所有展示模式從狀態(tài)歼郭,邏輯和同步方面總結(jié)的比較表格。
狀態(tài)邏輯同步
Supervising Controller
PresenterXX
ViewX
ModelDatabinding
Passive View
PresenterXX
ViewX
Presenter Model
PresenterXX
ViewX
MVVM
PresenterXX
ViewX
ModelDatabinding
MVC
ControllerXX
ViewX
下面是上面討論內(nèi)容的圖形化比較辐棒。
首先以上所有模式都是MVC的變種病曾。換句話說,所有MVP模式都是扭曲的MVC漾根。我們將首先比較MVC和MVP泰涂,之后我們將比較不同的MVP變種。
下面是MVP優(yōu)于MVC的情況.
UI單元測試:如果你的項(xiàng)目對(duì)UI有自動(dòng)化壓力單元測試辐怕,那么MVP優(yōu)于MVC逼蒙,因?yàn)镸VP的展示器類與所有UI邏輯隔離。展示器是UI的完全模擬寄疏,因此它可以使用VSTS測試套件或NUNIT單獨(dú)進(jìn)行單元測試是牢。
視圖有細(xì)微不同:如果你的應(yīng)用本質(zhì)上視圖對(duì)不同的數(shù)據(jù)可復(fù)用僵井,那么MVC就夠了。特別是應(yīng)用更注重報(bào)告驳棱。比如你有兩個(gè)視圖批什,幾乎一樣分別“按月銷售”和“按年銷售”。兩個(gè)報(bào)告使用同一個(gè)ASPX頁面顯示不同的模型社搅。那么如果你的應(yīng)用有相同的UI驻债,使用MVC的變種是個(gè)好選擇。特別是本質(zhì)上是面向報(bào)告的應(yīng)用形葬,MVC優(yōu)于MVP合呐。
多UI支持:如果預(yù)見應(yīng)用將使用不同而UI技術(shù),MVP是個(gè)好選擇荷并。換句話說合砂,應(yīng)用既支持Window還支持Web,優(yōu)選MVP源织。它將幫助你提高展示器類的復(fù)用性翩伪。
復(fù)雜的屏幕:如果有許多復(fù)雜的用戶交互,MVC會(huì)變得復(fù)雜谈息,因?yàn)樽罱K每個(gè)交互會(huì)有許多控制器類缘屹。MVP是更好的選擇,因?yàn)槟憧梢苑庋b這些復(fù)雜的邏輯到一個(gè)類侠仇,并可以分開測試來確保無bug轻姿。
技術(shù)使用:技術(shù)是一個(gè)非常重要的因素。如果技術(shù)支持架構(gòu)構(gòu)建自動(dòng)化逻炊,使用相應(yīng)的模式就變得更有意義互亮。例如你使用純ASP.NET,應(yīng)用不帶Silverlight或WPF余素,使用MVP會(huì)更理智豹休。ASP.NET頁面期望在其他代碼處理控制事件,而MVC則期望在控制器中處理事件桨吊。因此最終我們要重寫全部的事件處理代碼威根,因?yàn)锳SP.NET控制著控制器。如果你使用Silverlight或WPG视乐,它們有很好的丙丁支持洛搀,這使得MVP更適合。在另一方面佑淀,如果你有微小的變化留美,你也有3.5作為框架,你可以使用MVC框架,自動(dòng)滿足你的需求独榴。
選MVC還是MVP的60%是技術(shù)選擇驅(qū)動(dòng)的僧叉。