pureMVC

itializeCon itializeCon itializeCon

簡介

Pure MVC是在基於模型、視圖和控制器MVC模式建立的一個輕量級的套用框架,這種開源框架是免費的,它最初是執行的ActionScript 3語言使用的Adobe Flex、Flash和AIR,現在已經移植到幾乎所有主要的發展平台,目前支持兩個版本框架:標準和多核,總之,標準版提供了一種簡單的編碼分離的方法,按照MVC設計概念。除此之外,多核版本允許多個PureMVC套用運行在同一個虛擬機;模組化編程

在PureMVC實現的經典MVC元設計模式中,這三部分由三個單例模式類管理,分別是Model、View和Controller。三者合稱為核心層或核心角色。

PureMVC,就如同它的名字是,它是一個純粹的小巧的MVC框架,支持多語言。

PureMVC有一個名為Mediator的構造,顧名思義,它就是Mediator模式的實現,充當視圖API和程式其餘部分的API之間的中介。這是PureMVC實現MVC架構視圖部分的關鍵構造。引入它是為了減少套用和視圖之間的依賴,從而降低整個系統的耦合程度。

初始化

首先Facade是一個單例。在它的 構造函數裡除了單例應有的部分外,還有一句initializeFacade() 具體的實現是

protected function initializeFacade( ):void {

initializeModel();

initializeController();

initializeView();

}

很明顯,這裡揭示了Facade主要乾3件事情,初始化Model,Controller,View,而這三個都是單例

Model用於保存所有的Proxy,View用於保存所有的Mediator還可以註冊一些對notification的監聽,而Controller主要是保持一些Command。這些類提供了註冊的方法也提供了查詢的方法。那么Facade這個類本身也提供了對於Proxy,Mediator,Controller的訪問接口。這正符合Facade的本意:將眾多的對外接口統一起來,但是也不禁止底層的接口。

然後例子中的程式複寫了其中一個initializeContrller()的方法

override protected function initializeController():void

{

super.initializeController();

registerCommand( ApplicationConstants.NOTE_STARTUP,StartupCommand);

registerCommand( ApplicationConstants.NOTE_LOGIN, LoginCommand);

}

建立了兩對notification和Command之間的映射關係。

運行時候

最後是一個startup方法來作為整個程式的開始,發出一個表示開始的notification,這個notification則觸發了StartupCommand,這是一個多條Command的執行序列。分別是Model和View的準備command,它們完成了LoginProxy的註冊,LoginMediator的註冊並且把LoginPanel顯式在舞台上等待用戶輸入

我發帖的經驗不多,只是按照自己的思路寫了些東西,如果大家有不明白的地方我再細細解答。最近大概還準備結合這個例子,對其中用到的幾個設計模式進行論述,歡迎高手來討論。

優缺點

優點

1,支持多語言

Language Targets
ActionScript 2 Flex 1.5, Flash 8, FlashLite
ActionScript 3 Flex 2, 3, Flash 9/CS3, AIR.
C# .NET 1.0/2.0 Silverlight, Windows Mobile and Pocket PC.
ColdFusion ColdFusion 8
haXe JavaScript, Flash 8, Flash 9 and the Neko VM.
Java Java Mobile, Standard and Enterprise Editions (ME, SE, EE), JavaFX, Servlets, Applets, and GWT
JavaScript Browser neutral
Objective C Apple iPhone and Mac
PHP PHP 5
Python Python 2.5 for wxPython, Google App Engine, Pyjamas [13]
Ruby
C++ MSVC 8.0/9.0/10.0, MinGW 3.4.5, GNU G++, Embarcadero C++ 6.21

2,支持標準和多核,標準版提供代碼分離的方法,多核版支持模組化

缺點

1,靈活度過高,要清晰控制一個事務過程不容易。 這個是由通知無向性決定的,很難確定誰來監聽某一個通知,通知不利於調試。

2,代碼冗餘比較大,Mediator、Proxy等繼承類的冗餘代碼,但是ActionScript不支持Generics以及Reflection能力弱,使得難以消減代碼。

特點

PureMVC中還有另外一個 單例模式類——Facade,Facade提供了與核心層通信的唯一接口,以簡化開發複雜度。

Model 與 Proxy

Model保存對Proxy對象的引用,Proxy負責運算元據模型,與 遠程服務通信存取數據。

這樣保證了Model層的可移植性。

View 與 Mediator

View保存對Mediator對象的引用。由Mediator對象來操作具體的視圖組件(View Component,例如Flex的DataGrid組件),包括:添加事件監聽器,傳送或接收Notification ,直接改變視圖組件的狀態。

這樣做實現了把視圖和控制它的邏輯分離開來。

Controller 與 Command

Controller保存所有Command的映射。Command類是無狀態的,只在需要時才被創建。

Command可以獲取Proxy對象並與之互動,傳送Notification,執行其他的Command。經常用於複雜的或系統範圍的操作,如 應用程式的“啟動”和“關閉”。 應用程式的業務邏輯應該在這裡實現。

Facade 與 Core

Facade類套用 單例模式,它負責初始化核心層(Model,View和Controller),並能訪問它們的Public方法。

這樣,在實際的套用中,你只需繼承Facade類創建一個具體的Facade類就可以實現整個MVC模式,並不需要在代碼中導入編寫Model,View和Controller類。

Proxy、Mediator和Command就可以通過創建的Facade類來相互訪問通信。

Observer 與 Notification

PureMVC的通信並不採用Flash的EventDispatcher/Event,因為PureMVC可能運行在沒有Flash Event和EventDispatcher類的環境中,它的通信是使用觀察者模式以一種松耦合的方式來實現的。

你可以不用關心PureMVC的Observer/Notification機制是怎么實現的,它已經在 框架內部實現了。你只需要使用一個非常簡單的方法從Proxy, Mediator, Command和Facade傳送Notification,甚至不需要創建一個Notification實例。

Notification可以被用來觸發Command的執行

Facade保存了Command與Notification之間的映射。當Notification(通知)被

發出時,對應的Command(命令)就會自動地由Controller執行。Command實現複雜的互動,降低View和Model之間的 耦合性。

Mediator傳送、聲明、接收Notification

當用View註冊Mediator時,Mediator的listNotifications方法會被調用,以 數組形式返回該Mediator對象所關心的所有Notification。

之後,當系統其它角色發出同名的Notification(通知)時,關心這個通知的Mediator都會調用handleNotification方法並將Notification以 參數傳遞到方法。

Proxy傳送,但不接收Notification

在很多場合下Proxy需要傳送Notification(通知), 比如:Proxy從 遠程服務接收到數據時,傳送Notification告訴系統;或當Proxy的數據被更新時,傳送Notification告訴系統。

如果讓Proxy也偵聽Notification(通知)會導致它和View(視圖)層、Controller(控制)層的 耦合度太高。

View和Controller必須監聽Proxy傳送的Notification,因為它們的職責是通過可視化的界面使用戶能與Proxy持有的數據互動。

不過對View層和Controller層的改變不應該影響到Model層。

相關詞條

熱門詞條

聯絡我們