• 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。

  • 相关阅读:
    【P2236】彩票(搜索+剪枝)
    【P1714】切蛋糕(单调队列)
    【P1886】滑动窗口(单调队列→线段树→LCT)
    【P3522】TEM(单调队列+DP)
    【P3957】跳房子(单调队列+DP+二分)
    【P1947】笨笨当粉刷匠(DP+前缀和)
    【P2564】生日礼物(单调队列)
    【[NOI2011]智能车比赛】(建图+spfa+坑爹精度)
    diyiti.cpp
    由最小环问题想到的
  • 原文地址:https://www.cnblogs.com/studynote/p/3132194.html
Copyright © 2020-2023  润新知