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