zoukankan      html  css  js  c++  java
  • 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类的思维导图:

  • 相关阅读:
    48. Rotate Image
    83. Remove Duplicates from Sorted List
    46. Permutations
    HTML5笔记
    18. 4Sum
    24. Swap Nodes in Pairs
    42. Trapping Rain Water
    Python modf() 函数
    Python min() 函数
    Python max() 函数
  • 原文地址:https://www.cnblogs.com/iRavior/p/3356141.html
Copyright © 2011-2022 走看看