SCSF 系列:Smart Client Software Factory 中的 MVP 模式概述
Smart Client Software Factory 是一個關注 Smart Client (智能客戶端)構建的 UI 層框架,提供了對 MVP 模式的 First Class 支持,不了解 MVP 模式就不能完全領會 SCSF 的思想精華。
本篇及后面兩篇將結合 Smart Client Software Factory 講解 MVP 模式及面向對象設計原則,要點:
- SCSF 嚴格按照標準 MVP 架構模式構造 UI 層,代碼和架構完全吻合,給我們設計 MVP 應用提供了良好的參考。
- View 和 Presenter設計要以用例(Use Case)為基礎,以面向對象設計原則為準則。力求職責單一,有選擇的面向抽象,構建易測試、易理解的。
- Presenter 是整個用例的大管家,控制協調中心,自己基本上不做具體事情,核心工作都是組織和協調。作為控制器,Presenter了解與該用例相關的所有事情,因此能夠將合適的事情指派給合適的人去處理。
- IOC 使我們將對象創建銷毀和對象之間關系的維護在容器中進行,這是封裝變化和推遲決策原則的具體體現。
上一篇創建的 StopLight 項目演示了如何使用 SCSF構造基于 MVP 模式的應用。StopLight 功能很簡單,實現這樣的需求很多人只用一個窗體類就可以搞定,而且代碼量不會太大,理解維護起來不會太困難;使用 SCSF 的 MVP 構建卻涉及到了 10 個左右的類,并且初看起來里面的關系也變得撲朔迷離,難以捉摸。
這牽扯到一個普遍問題,框架、設計模式和良好的面向對象設計往往使系統類的數量增加,類之間的關系動態化,初看起來不容易了解,甚至令人望而生畏。因此很多人,尤其是用慣了 Windows 開發平臺的開發人員,認為很多模式和框架(例如今天我們討論的 MVP )雖然理論上看上去很美,但工程上似乎不太實用。Java 社區過多的研究模式,框架等理論,導致設計模式、框架的過度使用和濫用,確實拖累了很多項目。
今天,.NET 社區對框架、設計模式的追崇也慢慢的跟進 JAVA 社區,IOC,MVP,MVC,SOA,ESB等等一系列的架構理論都有了相應的框架實現。今天我們通過這個小題大做的 StopLight 來理解一下 MVP 究竟能夠我們帶來什么,我們又因此付出了什么代價,并初步討論什么樣的項目適合使用 SCSF。
MVP 模式(Model-View-Presenter)是由 MVC模式(Model-View-Controller)演變來的 UI 層框架模式,MVP 模式本身往往有多個設計模式組成。MVP 和 MVC 都采用了抽象的方式將界面部分劃分為相對獨立的多個模塊,并通過面向抽象編程(面向接口編程)來降低模塊間的耦合性,SCSF 利用依賴注入方式進一步使構建松散耦合的 MVP 應用變得方便。MVP 與 MVC 的比較將在后面的文章中介紹。
Model-View-Presenter 模式簡單結構圖
??????
該結構圖表示 View 直接和 Presenter 交互,Presenter 與 Model 交互,View 和 Model 直間沒有直接聯系。同時 Presenter 通過接口與 View 交互。
Smart Client Software Factory 與 Model-View-Presenter 模式
SCSF 中的 MVP 實現完全按照上圖模型實現,當我們使用 Add View(With Presenter)Guidance Package 生成 View 時,SCSF 為我們生成了三個類,本例中是IStopLightView ,StopLightView ,StopLightViewPresenter 。
MVP 之 Presenter
我們首先來看 Presenter ,在創建 SCSF 解決方案時,Guidance Package 自動在 Infrastructure 項目的接口層中(本例是 namespace SmartClient系列.Infrastructure.Interface)創建了一個抽象的 Presenter 類:
?
?1public?abstract?class?Presenter<TView>?:?IDisposable?2{
?3????……………
?4????????[ServiceDependency]
?5????????public?WorkItem?WorkItem?//Model
?6????????{
?7????????????get?{?return?_workItem;?}
?8????????????set?{?_workItem?=?value;?}
?9????}?
10
11????????public?TView?View?//View
12????????{
13????????????get?{?return?_view;?}
14????????????set?{?_view?=?value;?OnViewSet();?}
15????????}
16????……………
17}
里面的 View (TView 類型)代表的就是 MVP 中的 V ,WorkItem (WorkItem 類型,通過 [ServiceDependency] 注入)代表了 MVP 中的 M (也可以認為 WorkItem 中承載了 Model,通過 WorkItem 我們可以獲取所謂的 Model)。因此 Presenter 與 View 和 Model 建立起了關系。
MVP 之 View
再來看 StopLight 項目中的 V 部分由類 StopLightView 和接口 IStopLightView 組成,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????????///?設置完?TView?后調用具體的?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 部分介紹過,構造 StopLightView 對象時,SCSF 看到 Presenter 屬性前面的 [CreateNew] Attribute 會自動創建一個 StopLightViewPresenter 對象附給 _presenter 字段,而 _presenter.View = this? 語句表明新創建的StopLightViewPresenter 實例的 View 屬性設置為 StopLightView 實例。
這樣 View 就與 Prensenter 建立起了雙向關系,StopLightView 實例具有了 StopLightViewPresenter 實例的引用,一種強耦合的引用。
值得注意的是,StopLightViewPresenter 的實例的 View 屬性是在抽象類 Presenter 中定義的 <TView> 泛型類型,StopLightViewPresenter 的具體實現是:
public?partial?class?StopLightViewPresenter?:?Presenter<IStopLightView>也就是說,在 StopLightViewPresenter 類中,TView 泛型類型代表的是 IStopLightView 接口 ,因此 Presenter 與 View 通過接口進行聯系,是一種松散的耦合。這與上面介紹的 MVP 結構中說的 Presenter 通過接口與 View 交互完全一致。
MVP 之 Model
Model 是一個比較寬泛的概念,一般認為業務邏輯實體、服務組件等都可以看作 Model,StopLight 項目從 Unity 的 QuickStart StopLight 移植而來,沒有利用 SCSF 的 WorkItem 概念,而是直接在 Presenter 類中通過依賴注入方式與 Model 建立聯系,看下面例子中的 Stoplight 和 StoplightSchedule:
?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 兩個業務邏輯實體類是一種強的耦合關系,代表了 MVP 結構中 Presenter 與 Model 的關系。 在 SCSF 中,推薦的設計方式是所有的 View 和 Model 都駐留在該用例對應的 WorkItem 中,關于 WorkItem 后面會專門介紹到。
下一部分會介紹設計 MVP 應用的具體實踐、設計原則并簡要分析優缺點。
【FLYabroad】 SCSF 嚴格按照標準 MVP 架構模式構造 UI 層,代碼和架構完全吻合,給我們設計 MVP 應用提供了良好的參考。
轉載于:https://www.cnblogs.com/flyabroad/archive/2008/06/19/1225226.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的SCSF 系列:Smart Client Software Factory 中的 MVP 模式概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中Web程序修改配置文件不重启服
- 下一篇: @PathVariable 注解 说明