一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

SCSF 系列:Smart Client Software Factory 中的 MVP 模式概述 - FLYabroad.NET - 博客園

 唐伯龍 2011-04-16

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è)計原則,要點:

  • SCSF 嚴格按照標準 MVP 架構(gòu)模式構(gòu)造 UI 層,代碼和架構(gòu)完全吻合,給我們設(shè)計 MVP 應(yīng)用提供了良好的參考。
  • View 和 Presenter設(shè)計要以用例(Use Case)為基礎(chǔ),以面向?qū)ο笤O(shè)計原則為準則。力求職責單一,有選擇的面向抽象,構(gòu)建易測試、易理解的。
  • Presenter 是整個用例的大管家,控制協(xié)調(diào)中心,自己基本上不做具體事情,核心工作都是組織和協(xié)調(diào)。作為控制器,Presenter了解與該用例相關(guān)的所有事情,因此能夠?qū)⒑线m的事情指派給合適的人去處理。
  • IOC 使我們將對象創(chuàng)建銷毀和對象之間關(guān)系的維護在容器中進行,這是封裝變化和推遲決策原則的具體體現(xiàn)。

上一篇創(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)圖

MVP      

該結(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 。

StopLight-MVP

MVP 之 Presenter

我們首先來看 Presenter ,在創(chuàng)建 SCSF 解決方案時,Guidance Package 自動在 Infrastructure 項目的接口層中(本例是 namespace SmartClient系列.Infrastructure.Interface)創(chuàng)建了一個抽象的 Presenter 類:

Presenter.cs 

 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 之 Model

Model 是一個比較寬泛的概念,一般認為業(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)用提供了良好的參考。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美整片精品日韩综合| 欧美黄色成人真人视频| 日本高清视频在线观看不卡| 91久久精品国产一区蜜臀| 欧美日韩国产福利在线观看| 日韩人妻中文字幕精品| 老司机精品一区二区三区| 中文字幕熟女人妻视频| 国产精品久久久久久久久久久痴汉| 国产爆操白丝美女在线观看| 亚洲熟妇av一区二区三区色堂| 亚洲一级二级三级精品| 久久本道综合色狠狠五月| 国产精品午夜福利免费阅读| 国产精品视频久久一区| 日本加勒比在线观看一区| 国产在线不卡中文字幕| 色婷婷人妻av毛片一区二区三区| 韩国日本欧美国产三级| 激情内射亚洲一区二区三区| 亚洲综合精品天堂夜夜| 国产精品欧美日韩中文字幕| 日韩一区二区三区有码| 久久碰国产一区二区三区| 色鬼综合久久鬼色88| 成人你懂的在线免费视频| 国产欧洲亚洲日产一区二区| 日韩欧美二区中文字幕| 欧美高潮喷吹一区二区| 免费播放一区二区三区四区 | 国产传媒中文字幕东京热| 午夜福利视频偷拍91| 黑人巨大精品欧美一区二区区| 99少妇偷拍视频在线| 欧美野外在线刺激在线观看| 在线日韩欧美国产自拍| 制服丝袜美腿美女一区二区| 免费国产成人性生活生活片| 国产黄色高清内射熟女视频| 亚洲一区二区精品国产av| 五月综合婷婷在线伊人|