一.介紹
PureMVC是基於MVC思想建立的一個輕量級的應用框架,這套框架有多種語言的版本
ActionScript 2
ActionScript 3
C++
C#
ColdFusion
Dart
Haxe
Java
JavaScript
Objective C
Perl
PHP
Python
Ruby
TypeScript
且大多數語言都支持兩個版本的框架,一個是標准版,不支持多模塊,另一個是multicore版,支持多模塊。
從https://github.com/PureMVC我們可以得到這些框架,和一些應用框架的demo。
二.Model,View,Controller和Facade
Model,View,Controller和Facade都使用單例模式,Modal主要通過維護proxyMap來提供對各種數據的訪問。View主要通過維護MediatorMap來提供對視圖的操作,通過維護observerMap使得視圖響應各種事件。Controller通過維護commandMap來處理各種事件。
而Facade為Model、View和Controller提供一致對外的界面,定義了一組高層接口,這使得子系統更容易使用。引入Facade后,外部調用子系統只需要通過Facade就可以了,在Facade里面封裝對Model、View和Controller的調用。在我們利用PureMVC框架時,最佳實踐是一般不用去繼承Model、View和Controller定義子類來獲得對數據,事件的支持,而是通過定義一系列的Proxy,Mediator和Command來定義數據,處理事件,並通過定義Facade的子類來將這一系列的Proxy,Mediator和Command引入系統中。一般Facade的子類定義如下:
public class ApplicationFacade extends Facade implements IFacade { public static const STARTUP:String = "startup"; public static function getInstance() : ApplicationFacade { if ( instance == null ) instance = new ApplicationFacade( ); return instance as ApplicationFacade; } override protected function initializeController( ) : void { super.initializeController(); registerCommand( STARTUP, StartupCommand ); } public function startup( stage:Object ):void { sendNotification( STARTUP, stage ); } }
1.定義了ApplicationFacade子類后,就可以通過ApplicationFacade.getInstance().startup( this.stage )來啟動系統了。
2.可以通過override方法initializeModel和initializeView方法來引入Proxy和Mediator,但在實踐中我們通常是在StartupCommand中進行相關操作。且除了必須要在啟動的時候注冊的Command比如StartupCommand外,其他的Command最好都不要在這里注冊。
三.Proxy, Command,Mediator和Notifier
Notifier是一個引用了facade對象的子類,且封裝了facade對象的sendNotification方法。而Proxy, Command和Mediator都繼承自Notifier,這使得這兩個類都能夠發送消息,以使用PureMVC的消息系統。且能夠使用facade對象的接口來調用一些方法,比如注冊和獲取Proxy數據源,注冊Mediator中介等。
四.Proxy和Modal
每個Proxy子類都封裝了對一種數據的操作,多個子類則封裝了多種數據。Modal主要通過維護proxyMap來注冊和獲取數據源,而Facade也提供了對proxyMap進行操作的接口。Command和Mediator也能隨時通過facade來注冊或獲取需要的數據源。在一個系統中,同一個名稱的Proxy只能有一個實例對象。
PureMVC的這一設計,使得數據源可以輕松的被獲取,操作,此外,Proxy本身也繼承了Notifier的sendNotification方法,當Proxy數據更改時能夠通知相關視圖,使多個視圖能夠共用同一數據源。
在實現Proxy時應該注意,Proxy和視圖的通信應該僅通過sendNotification方法,Proxy不需要知道視圖的狀態,不應該對視圖產生依賴。
五.Mediator,Observer和View
Mediator是系統和視圖之間的中介。View主要通過維護MediatorMap和ObserverMap來支持系統和視圖之間的通信。其中ObserverMap保存了一個Notifiction消息和Observer數組之間的對應關系,這是利用觀察者模式來實現的消息系統。而MediatorMap則保存了系統中所有的Mediator,當每個Mediator被加入系統中時,系統都會通過listNotificationInterests方法查看該Mediator關注哪些消息,並將Mediator加入相應的觀察者中,將其handleNotification方法注冊為其關注的消息的處理函數。
在實現Mediator時,主要注意的就是需要重寫listNotificationInterests和handleNotification方法,且提供對視圖事件的EventListerner。
六.Command和Cotroller
Command主要負責Proxy和Mediator之間的交互,Controller通過commandMap來保存Notification和command之間的關系,在registerCommand的同時,會將Controller加入對應Notifiction消息的觀察者中,並使用Command來處理消息。
Command分為SingleCommand和MacroCommand。MacroCommand讓你可以順序執行多個Command。每個執行都會創建一個Command對象並傳參一個對源Notification的引用。
MacroCommand在構造方法調用自身的initializeMacroCommand方法。實際應用中,你需重寫這個方法,調用addSubCommand添加子Command。你可以任意組合SimpleCommand和MacroCommand成為一個新的Command。