黃建崗
摘要:本文主要介紹了軟件UI設(shè)計和邏輯設(shè)計中的架構(gòu)模式的發(fā)展過程,以及作為微軟新一代客戶端軟件WPF,選擇適合的設(shè)計模式來架構(gòu)開發(fā)模型,更容易的實現(xiàn)應(yīng)用UI的構(gòu)建。
關(guān)鍵詞:WPF WVC WVP WVVM UI
0引言
在把軟件的Ul設(shè)計和邏輯設(shè)計分開的開發(fā)模式中,以XAML+C#的WPF開發(fā)逐漸占據(jù)了重要的位置。但是,當(dāng)Binding與依賴屬性、路由事件和命令不加約束地亂用和過度使用,這種開發(fā)一樣會導(dǎo)致軟件架構(gòu)的不穩(wěn)固以及招致維護、測試和調(diào)試方面的麻煩。那么,怎樣才能用好WPF帶來的結(jié)構(gòu)上的新特性呢?又如何選擇其使用模式?
1MVC模式
MVC(ModaI View ControIer)本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分商,從而使同一個程序可以使用不同的表現(xiàn)形式。
MVC是Xerox PARC在八十年代為編程語言SmaIltaIk—80發(fā)明的一種軟件設(shè)計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺的設(shè)計模式,并且受到越來越多的使用Cold-Fusion和PHP的開發(fā)者的歡迎。MVC框架生成軟件UI和邏輯用的是同一種語言(比如c++/Java/delphi)靈活性基本上是局限在對于同一塊數(shù)據(jù)(Model爆露出來)使用不同的視圖(View,也就是U1)展現(xiàn)給用戶。
目前,一般高級的界面工具或構(gòu)造器不支持MVC模式。改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難。
2MVP模式
MVP是從MVC模式演變而來,它們基本思想有相通之處:ControlIer/Presenter負(fù)責(zé)邏輯處理,Model提供數(shù)據(jù),View負(fù)責(zé)顯示。而MVP與MVC有著重大區(qū)別是:在MVP中View并不直接使用Model,它們之間的通信是通過Presenter(MVC中的ControlIer)來進行的,所有的交互都發(fā)生在Presenter內(nèi)部,而在MVC中View會從Model中直接讀取數(shù)據(jù)而不是通過Controller。
隨著互聯(lián)網(wǎng)的發(fā)展,程序不僅僅是運行在特定操作系統(tǒng)上的代碼塊,網(wǎng)絡(luò)用戶希望使用相同的程序共享相同的數(shù)據(jù)。多種操作系統(tǒng)平臺的不統(tǒng)一,造成各廠商程序的運行限制。為了實現(xiàn)程序共享數(shù)據(jù),開發(fā)人員只好訴諸于所有操作系統(tǒng)平臺的交集——瀏覽器。
程序跑到了瀏覽器里,不需要開發(fā)人員重新開發(fā)。因為人們發(fā)現(xiàn),無論程序的前端(UI部分)跑在哪里,它的后臺邏輯是不會改變的。于是我們會想怎樣才能把UI和邏輯解耦并對邏輯層加以復(fù)用呢?必定需要在設(shè)計或者重構(gòu)的時候考慮這一點才可以。
在MVP模式中,為了讓UI層能夠從邏輯層上分出來,設(shè)計師們在U1層與邏輯層之間加了一層interface。
由圖1說明如下幾點:①1View這個interface層幫助我們把各類UI與邏輯層解耦;②傳統(tǒng)的、由winForm/Web Form/MFc等編寫的UI是通過事件(本質(zhì)是Windows消息)與IView層溝通的;③WPF與IVlew層的溝通,最佳的手段是使用Binding,當(dāng)然,也可以使用事件;④Presenter層要實現(xiàn)IView,多態(tài)機制可以保證運行時UI層顯示恰當(dāng)?shù)臄?shù)據(jù)。比如Binding,在程序中,你可能看到Binding的Source是某個interface類型的變量——實際上,這個interface變量引用著的對象才是真正的數(shù)據(jù)源;⑤可有可無的Control,原版的MVP圖里是沒有ContoI的,Control被Presenter取代。
3MVVM模式
WPF帶來了新的技術(shù)體驗,如Sliverlight、音視頻、3D、動畫等,這導(dǎo)致了軟件UI層更加細(xì)節(jié)化、可定制化。同時,在技術(shù)層面,WPF也帶來了諸如Binding、Dependency Prope rty、Routed Events、Command、DataTempiate、ControlTempIate等新特性。我們怎樣才能立足于原有MVP框架、把WPF的新特性揉合進去,以應(yīng)對客戶復(fù)雜的需求呢?
可以說MWM是專為WPF打造的模式,見圖2所示。
View綁定到VjewModel,然后執(zhí)行一些命令在向它請求一個動作。而反過來,ViewModel跟Model通訊,告訴它更新來響應(yīng)UI。這樣便使得為應(yīng)用構(gòu)建UI非常的容易。往一個應(yīng)用程序上貼一個界面越容易,外觀設(shè)計師就越容易使用BIend來創(chuàng)建一個漂亮的界面。同時,當(dāng)UI和功能越來越松耦合的時候,功能的可測試性就越來越強。
無論是UI開發(fā)人員還是數(shù)據(jù)開發(fā)人員,都要尊重這個契約、按照它進行設(shè)計和開發(fā)。這樣,理想狀態(tài)下無論是Web UI還是WindOW UI就都可以使用同一套數(shù)據(jù)邏輯了。