PureMVC框架应用简述

一.介绍

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。

原文地址:https://www.cnblogs.com/studynote/p/3132194.html