• PureMVC(JS版)源码解析(六):MacroCommand类


    上一篇博客,我们讲解了SimpleCommand类,接下来我们看一下与SimpleCommand类很相似的MacroCommand类。

    MacroCommand类和SimpleCommand类一样,都继承Notifier类(通知者),都可以发送消息。

    /* subclass Notifier */
    MacroCommand.prototype= new Notifier;
    MacroCommand.prototype.constructor= MacroCommand;

    MacroCommand类比SimpleCommand类多了一个subCommands属性。它是干嘛用的呢?其实,通过类名我们就可以看出MacroCommand类和SimpleCommand类的异同。"SimpleCommand"顾名思义可以理解为”简单的命令,"MacroCommand"可以理解为"巨大的、大量的命令".subCommands是一个数组,它里面存放者多个SimpleCommand类和MacroCommand类(我们把SimpleCommand类和MacroCommand类统称为命令类),在MacroCommand对象接收到消息时,他就会依次调用subCommands里面所有命令的execute()方法(执行命令)。

    MacroCommand类和SimpleCommand类一样,都有一个execute()方法(执行命令),但是MacroCommand类的execute()方法比SimpleCommand类的execute()要复杂很多:

    /**
     * Execute this MacroCommands *SubCommands*
     * 
     * The *SubCommand*s will be called in First In / First Out (FIFO) order
     * @param {puremvc.Notification} note
     *  The Notification object to be passed to each *SubCommand*
     */
    MacroCommand.prototype.execute= function(note)
    {
        // SIC- TODO optimize
        while(this.subCommands.length > 0)
        {
            var ref= this.subCommands.shift();
            var cmd= new ref;
            cmd.initializeNotifier(this.multitonKey);
            cmd.execute(note);
        }
    };

    MacroCommand类有一个addSubCommand()方法,用来往subCommands数组里面添加命令类。

    /**
     * @protected
     * Add a *SubCommand*
     * The *SubCommand*s will be called in First In / First Out (FIFO) order
     * @param {Function} commandClassRef
     *  A reference to a subclassed SimpleCommand or MacroCommand constructor
     */
    MacroCommand.prototype.addSubCommand= function(commandClassRef)
    {
        this.subCommands.push(commandClassRef);
    };

    我们再看看MacroCommand类的构造函数:

     /*
     * If your subclass does define a constructor, be sure to call "super" like so
     * 
     *     function MyMacroCommand ()
     *     {
     *         MacroCommand.call(this);
     *     };
     * @constructor
     */
    function MacroCommand()
    {
        this.subCommands= [];
        this.initializeMacroCommand();
    };

    在MacCommand类的构造函数中,先对subCommands属性进行了初始化,然后调用了initializeMacroCommand()方法。【我们注意注释,可以知道我们继承MacCommand类的,需要在自雷的构造函数中调用MacroCommand的构造函数(MacroComand.call(this)】。

    我们看看initializeMacroCommand()方法:

    MacroCommand.prototype.initializeMacroCommand= function() {}

    initializeMacroCommand类,主要是MacroCommand对象的初始化,在继承MacroCommand的子类中我们需要重写这个方法,源码中有这么一段注释:

    * In your subclass, override this method to 
     * initialize the MacroCommand's *SubCommand*  
     * list with command class references like 
     * this:
     * 
     *     // Initialize MyMacroCommand
     *     MyMacroCommand.prototype.initializeMacroCommand= function ()
     *     {
     *         this.addSubCommand( com.me.myapp.controller.FirstCommand );
     *         this.addSubCommand( com.me.myapp.controller.SecondCommand );
     *         this.addSubCommand( com.me.myapp.controller.ThirdCommand );
     *     };
     * 
     * Note that *SubCommand*s may be any command implementor,
     * MacroCommands or SimpleCommands are both acceptable.

    其实,initializeMacroCommand类其实就是往subCommands数组中添加命令类(可以是SimpleCommand类也可以是MacroCommand类,记住添加的是类名,不是类的实例化对象,MacroCommand对象接收到消息后,会在execute()方法中实例化这些命令类)。

    在实际开发过程中,我们需要写一些复杂的逻辑处理单元(Command类),这写逻辑处理类要么继承SimpleCommand,要么继承MacroCommand类,哪什么时候继承MacroCommand类,什么时候继承SimpleCommand类,需要看我们逻辑的复杂度,如果一个逻辑单元可以拆分为多个子逻辑单元,那我们可以继承MacroCommand类,如果一个逻辑单元就可以处理,那我们只需要继承SimpleCommand类。

    关于,SimleCommand类和MacroCommand类的不同,源码中有这么一段注释:

    * Unlike {@link puremvc.SimpleCommand SimpleCommand}, 
     * your subclass should not override #execute but instead, should 
     * override the #initializeMacroCommand method, calling #addSubCommand once for 
     * each *SubCommand* to be executed.
     * 

    上面的注释说的很清楚,就是继承MacroCommand类的子类需要重写initializeMacroCommand方法,不需要重写execute方法,继承SimpleCommand类的子类需要重写execute方法。

    最后,附上MacroCommand类的思维导图:

  • 相关阅读:
    OpenMP vs WinSxS
    JIT, dynarec and binary translation
    VC++2010 bug
    控制和释放共享内存块
    分配和释放信号量
    代码列表5.1 (shm.c) 尝试共享内存
    绑定和脱离
    信号量
    每个字段动态添加一个随机数
    最近做了一个红底鞋类电商网站
  • 原文地址:https://www.cnblogs.com/iRavior/p/3356141.html
Copyright © 2020-2023  润新知