Pure MVC是在基於模型、視圖和控制器MVC模式建立的一個輕量級的套用框架,這種開源框架是免費的,它最初是執行的ActionScript 3語言使用的Adobe Flex、Flash和AIR,現在已經移植到幾乎所有主要的發展平台,目前支持兩個版本框架:標準和多核,總之,標準版提供了一種簡單的編碼分離的方法,按照MVC設計概念。
基本介紹
- 外文名:pureMVC
- 模式:模型、視圖和控制器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層。