簡介
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,支持多語言
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層。



















