上篇文章,分析了SimpleCommand类,接下来分析与SimpleCommand类很相似的MacroCommand类。
MacroCommand类和SimpleCommand类一样,都继承Notifier类(通知者),都可以发送消息。
1 | /* subclass Notifier */ |
MacroCommand类比SimpleCommand类多了一个subCommands
属性。它是干嘛用的呢?其实,通过类名我们就可以看出MacroCommand类和SimpleCommand类的异同。
SimpleCommand顾名思义可以理解为”简单的命令”,MacroCommand可以理解为”巨大的、大量的命令”。
subCommands是一个数组,它里面存放者多个SimpleCommand类和MacroCommand类(把SimpleCommand类和MacroCommand类统称为命令类),在MacroCommand对象接收到消息时,它就会依次调用subCommands里面所有命令的execute()方法(执行命令)。
MacroCommand类和SimpleCommand类一样,都有一个execute()
方法(执行命令),但是MacroCommand类的execute()
方法比SimpleCommand类的execute()要复杂很多:
1 |
|
MacroCommand类有一个addSubCommand()
方法,用来往subCommands
数组里面添加命令类。
1 | /** |
再看看MacroCommand类的构造函数:
1 | /* |
在MacroCommand类的构造函数中,先对subCommands
属性进行了初始化,然后调用了initializeMacroCommand()
方法。【通过注释,可以知道继承MacCommand类的,需要在的构造函数中调用MacroCommand的构造函数(MacroComand.call(this)
。
我们看看initializeMacroCommand()
方法:
1 | MacroCommand.prototype.initializeMacroCommand= function() {} |
initializeMacroCommand()
主要是MacroCommand对象的初始化,在继承MacroCommand的子类中我们需要重写这个方法,源码中有这么一段注释:
1 | * In your subclass, override this method to |
其实,initializeMacroCommand()
其实就是往subCommands
数组中添加命令类(可以是SimpleCommand类也可以是MacroCommand类,记住添加的是类名,不是类的实例化对象,MacroCommand对象接收到消息后,会在execute()方法中实例化这些命令类)。
在实际开发过程中,我们需要写一些复杂的逻辑处理单元(Command类),这写逻辑处理类要么继承SimpleCommand,要么继承MacroCommand类,哪什么时候继承MacroCommand类,什么时候继承SimpleCommand类,需要看我们逻辑的复杂度,如果一个逻辑单元可以拆分为多个子逻辑单元,那我们可以继承MacroCommand类,如果一个逻辑单元就可以处理,那我们只需要继承SimpleCommand类。
关于,SimpleCommand类和MacroCommand类的不同,源码中有这么一段注释:
1 | * Unlike {@link puremvc.SimpleCommand SimpleCommand}, |
上面的注释说的很清楚,就是继承MacroCommand类的子类需要重写initializeMacroCommand()
方法,不需要重写execute()
方法,继承SimpleCommand类的子类需要重写execute()
方法。