宏命令是一批命令的集合,通过执行宏命令的方式,一次可以执行一批命令。 不管宏命令还是子命令,都有一个execute方法来执行命令。
在下面的例子中,基本对象可以被组合成更复杂的组合对象,组合对象又可以被组合,这样不断递归下去,这棵树的结构可以支持任意多的复杂度。在树最终被构造完成之后,让整颗树最终运转起来的步骤非常简单,只需要调用最上层对象的execute方法。每当对最上层的对象进行一次请求时,实际上是在对整个树进行深度优先的搜索,而创建组合对象的程序员并不关心这些内在的细节,往这棵树里面添加一些新的节点对象是非常容易的事情。
<body>
<button id="start">开启正常流程</button>
<script>
const openAcCommand = {
execute: function() {
console.log('打开空调')
}
}
const openTvCommand = {
execute: function() {
console.log('打开电视')
}
}
const openSoundCommand = {
execute: function() {
console.log('打开音响')
}
}
const closeDoorCommand = {
execute: function() {
console.log('关门')
}
}
const openPcCommand = {
execute: function() {
console.log('打开电脑')
}
}
const loginQQCommand = {
execute: function() {
console.log('登录qq')
}
}
const MacroCommand = function() {
return {
commandList: [],
add:function(c) {
this.commandList.push(c)
},
execute: function() {
for ( var i = 0, command; command = this.commandList[ i++ ]; ){
command.execute();
}
}
}
}
const macroCommand1 = MacroCommand()
macroCommand1.add( closeDoorCommand );
macroCommand1.add( openPcCommand );
macroCommand1.add( loginQQCommand );
const macroCommand2 = MacroCommand()
macroCommand2.add( openTvCommand );
macroCommand2.add( openSoundCommand );
// 把所有的命令组成一个超级命令
const macroCommand = MacroCommand();
macroCommand.add( macroCommand1 );
macroCommand.add( macroCommand2 );
macroCommand.add( openAcCommand );
const setCommand = (function(command) {
document.getElementById('start').onclick = function() {
command.execute()
}
})(macroCommand)
</script>
</body>