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