一.介绍
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。