展現(xiàn)模式比較

展示模式架構(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的3大問題:狀態(tài),邏輯和同步

下面列出了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ì)模式

展示設(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ì)模式的解釋。

監(jiān)督控制器模式(SC)

SC的基礎(chǔ):

狀態(tài)存儲(chǔ)在視圖里蚀浆。

展示器包含復(fù)雜的展示邏輯缀程。簡單的UI綁定邏輯通過使用綁定技術(shù)來完成,例如WIF綁定和Silverlight綁定蜡坊。任何復(fù)雜性有展示器類處理杠输。

展示器知道視圖。

視圖不知道知道展示器秕衙。

視圖使用由WPF和Silverlight提供的綁定技術(shù)與模型鏈接蠢甲。

被動(dòng)視圖(PV)

PV的基礎(chǔ):

狀態(tài)存儲(chǔ)在視圖里。

所有UI邏輯存儲(chǔ)在展示器里据忘。

視圖與模型完全隔離鹦牛。它還處理模型和視圖見額外的同步任務(wù)搞糕。

展示器知道視圖

視圖不知道展示器。

你可以從這里知道更多關(guān)于MVP(PV)的知識(shí)曼追,它還有一個(gè)樣例代碼窍仰,展示了MVP如何進(jìn)入行動(dòng)鏈的。

展示模型(PM)

PM的基礎(chǔ):

狀態(tài)儲(chǔ)存在展示器里礼殊。

邏輯存儲(chǔ)在展示器里驹吮。

展示器代編一個(gè)抽象的UI視圖。

展示器不知道視圖

視圖知道展示器晶伦。

視圖與模型完全隔離碟狞。

MVVM

MVVM的基礎(chǔ):

展示器模型是基礎(chǔ)。

狀態(tài)儲(chǔ)存在展示器里婚陪。

邏輯存儲(chǔ)在展示器里族沃。

展示器代表一個(gè)UI的抽像視圖。

展示器不知道視圖泌参。

視圖知道展示器脆淹。

視圖與模型完全隔離。

使用WPF和Silverlight綁定沽一。

MVC

MVC的基礎(chǔ):

沒有展示器盖溺,有一個(gè)控制器。

請求首先到達(dá)控制器铣缠。

控制器綁定模型和視圖咐柜。

邏輯存儲(chǔ)在控制器里。

你可以從這里知道更多MVC的知識(shí)攘残,它還有一個(gè)樣例代碼,展示了MVC如何處理行動(dòng)鏈为狸。

總結(jié)

下面是對(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)容的圖形化比較辐棒。

何時(shí)使用MVP或MVC

首先以上所有模式都是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)的僧叉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棺榔,隨后出現(xiàn)的幾起案子瓶堕,更是在濱河造成了極大的恐慌,老刑警劉巖症歇,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郎笆,死亡現(xiàn)場離奇詭異,居然都是意外死亡忘晤,警方通過查閱死者的電腦和手機(jī)宛蚓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來设塔,“玉大人凄吏,你說我怎么就攤上這事∪蚧祝” “怎么了痕钢?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長序六。 經(jīng)常有香客問我任连,道長,這世上最難降的妖魔是什么例诀? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任随抠,我火速辦了婚禮,結(jié)果婚禮上繁涂,老公的妹妹穿的比我還像新娘拱她。我一直安慰自己,他們只是感情好扔罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布椭懊。 她就那樣靜靜地躺著,像睡著了一般步势。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上背犯,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天坏瘩,我揣著相機(jī)與錄音,去河邊找鬼漠魏。 笑死倔矾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哪自,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼丰包,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壤巷?” 一聲冷哼從身側(cè)響起邑彪,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胧华,沒想到半個(gè)月后寄症,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矩动,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年有巧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲没。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篮迎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出示姿,到底是詐尸還是另有隱情甜橱,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布峻凫,位于F島的核電站渗鬼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荧琼。R本人自食惡果不足惜譬胎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望命锄。 院中可真熱鬧堰乔,春花似錦、人聲如沸脐恩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驶冒。三九已至苟翻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骗污,已是汗流浹背崇猫。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留需忿,地道東北人诅炉。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓蜡歹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涕烧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月而,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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