SCSF 系列:Smart Client Software Factory 中的 MVP 模式概述Smart Client Software Factory 是一個關(guān)注 Smart Client (智能客戶端)構(gòu)建的 UI 層框架,提供了對 MVP 模式的 First Class 支持,不了解 MVP 模式就不能完全領(lǐng)會 SCSF 的思想精華。 本篇及后面兩篇將結(jié)合 Smart Client Software Factory 講解 MVP 模式及面向?qū)ο笤O(shè)計原則,要點:
上一篇創(chuàng)建的 StopLight 項目演示了如何使用 SCSF構(gòu)造基于 MVP 模式的應(yīng)用。StopLight 功能很簡單,實現(xiàn)這樣的需求很多人只用一個窗體類就可以搞定,而且代碼量不會太大,理解維護起來不會太困難;使用 SCSF 的 MVP 構(gòu)建卻涉及到了 10 個左右的類,并且初看起來里面的關(guān)系也變得撲朔迷離,難以捉摸。 這牽扯到一個普遍問題,框架、設(shè)計模式和良好的面向?qū)ο笤O(shè)計往往使系統(tǒng)類的數(shù)量增加,類之間的關(guān)系動態(tài)化,初看起來不容易了解,甚至令人望而生畏。 因此很多人,尤其是用慣了 Windows 開發(fā)平臺的開發(fā)人員,認為很多模式和框架(例如今天我們討論的 MVP )雖然理論上看上去很美,但工程上似乎不太實用。Java 社區(qū)過多的研究模式,框架等理論,導(dǎo)致設(shè)計模式、框架的過度使用和濫用,確實拖累了很多項目。 今天,.NET 社區(qū)對框架、設(shè)計模式的追崇也慢慢的跟進 JAVA 社區(qū),IOC,MVP,MVC,SOA,ESB等等一系列的架構(gòu)理論都有了相應(yīng)的框架實現(xiàn)。今天我們通過這個小題大做的 StopLight 來理解一下 MVP 究竟能夠我們帶來什么,我們又因此付出了什么代價,并初步討論什么樣的項目適合使用 SCSF。 MVP 模式(Model-View-Presenter)是由 MVC模式(Model-View-Controller)演變來的 UI 層框架模式,MVP 模式本身往往有多個設(shè)計模式組成。MVP 和 MVC 都采用了抽象的方式將界面部分劃分為相對獨立的多個模塊,并通過面向抽象編程(面向接口編程)來降低模塊間的耦合性,SCSF 利用依賴注入方式進一步使構(gòu)建松散耦合的 MVP 應(yīng)用變得方便。MVP 與 MVC 的比較將在后面的文章中介紹。 Model-View-Presenter 模式簡單結(jié)構(gòu)圖該結(jié)構(gòu)圖表示 View 直接和 Presenter 交互,Presenter 與 Model 交互,View 和 Model 直間沒有直接聯(lián)系。同時 Presenter 通過接口與 View 交互。 Smart Client Software Factory 與 Model-View-Presenter 模式SCSF 中的 MVP 實現(xiàn)完全按照上圖模型實現(xiàn),當我們使用 Add View(With Presenter)Guidance Package 生成 View 時,SCSF 為我們生成了三個類,本例中是IStopLightView ,StopLightView ,StopLightViewPresenter 。 MVP 之 Presenter我們首先來看 Presenter ,在創(chuàng)建 SCSF 解決方案時,Guidance Package 自動在 Infrastructure 項目的接口層中(本例是 namespace SmartClient系列.Infrastructure.Interface)創(chuàng)建了一個抽象的 Presenter 類: 1public abstract class Presenter<TView> : IDisposable
2 里面的 View (TView 類型)代表的就是 MVP 中的 V ,WorkItem (WorkItem 類型,通過 [ServiceDependency] 注入)代表了 MVP 中的 M (也可以認為 WorkItem 中承載了 Model,通過 WorkItem 我們可以獲取所謂的 Model)。因此 Presenter 與 View 和 Model 建立起了關(guān)系。 MVP 之 View再來看 StopLight 項目中的 V 部分由類 StopLightView 和接口 IStopLightView 組成,StopLightView 繼承自 UserControl 并實現(xiàn)了 IStopLightView 接口: public partial class StopLightView : UserControl, IStopLightView
在 StopLightView.GeneratedCode.cs 文件(StopLightView 的分部類)中代碼如下: 1namespace SmartClient系列.StopLight
2{ 3 [SmartPart] 4 public partial class StopLightView 5 { 6 /// <summary> 7 /// Sets the presenter. The dependency injection system will automatically 8 /// create a new presenter for you. 9 /// 設(shè)置完 TView 后調(diào)用具體的 OnViewSet() 方法 10 /// </summary> 11 [CreateNew] 12 public StopLightViewPresenter Presenter 13 { 14 set 15 { 16 _presenter = value; 17 _presenter.View = this; //注意了! 18 } 19 } 20 } 21} 22 我們通過 [SmartPart] Attribute 標志該類(StopLightView)是一個 SmartPart(SCSF 中的概念,代表一個視圖部件)。我們在 ObjectBuilder 部分介紹過,構(gòu)造 StopLightView 對象時,SCSF 看到 Presenter 屬性前面的 [CreateNew] Attribute 會自動創(chuàng)建一個 StopLightViewPresenter 對象附給 _presenter 字段,而 _presenter.View = this 語句表明新創(chuàng)建的StopLightViewPresenter 實例的 View 屬性設(shè)置為 StopLightView 實例。 這樣 View 就與 Prensenter 建立起了雙向關(guān)系,StopLightView 實例具有了 StopLightViewPresenter 實例的引用,一種強耦合的引用。 值得注意的是,StopLightViewPresenter 的實例的 View 屬性是在抽象類 Presenter 中定義的 <TView> 泛型類型,StopLightViewPresenter 的具體實現(xiàn)是: public partial class StopLightViewPresenter : Presenter<IStopLightView>
也就是說,在 StopLightViewPresenter 類中,TView 泛型類型代表的是 IStopLightView 接口 ,因此 Presenter 與 View 通過接口進行聯(lián)系,是一種松散的耦合。這與上面介紹的 MVP 結(jié)構(gòu)中說的 Presenter 通過接口與 View 交互完全一致。 MVP 之 ModelModel 是一個比較寬泛的概念,一般認為業(yè)務(wù)邏輯實體、服務(wù)組件等都可以看作 Model,StopLight 項目從 Unity 的 QuickStart StopLight 移植而來,沒有利用 SCSF 的 WorkItem 概念,而是直接在 Presenter 類中通過依賴注入方式與 Model 建立聯(lián)系,看下面例子中的 Stoplight 和 StoplightSchedule: 1 public partial class StopLightViewPresenter : Presenter<IStopLightView>
2 { 3 private Stoplight stoplight; 4 private StoplightSchedule schedule; 5 [Dependency] 6 public Stoplight Stoplight 7 { 8 get { return stoplight; } 9 set { stoplight = value; } 10 } 11 [Dependency] 12 public StoplightSchedule Schedule 13 { 14 get { return schedule; } 15 set { schedule = value; } 16 } 17 ………… 18 } 這里, StopLightViewPresenter 與 Stoplight ,StoplightSchedule 兩個業(yè)務(wù)邏輯實體類是一種強的耦合關(guān)系,代表了 MVP 結(jié)構(gòu)中 Presenter 與 Model 的關(guān)系。 在 SCSF 中,推薦的設(shè)計方式是所有的 View 和 Model 都駐留在該用例對應(yīng)的 WorkItem 中,關(guān)于 WorkItem 后面會專門介紹到。 下一部分會介紹設(shè)計 MVP 應(yīng)用的具體實踐、設(shè)計原則并簡要分析優(yōu)缺點。 【FLYabroad】 SCSF 嚴格按照標準 MVP 架構(gòu)模式構(gòu)造 UI 層,代碼和架構(gòu)完全吻合,給我們設(shè)計 MVP 應(yīng)用提供了良好的參考。 |
|
來自: 唐伯龍 > 《SCSF & CAB》