使用组合模式以及宏命令执行一系列子命令

214 阅读1分钟

宏命令是一批命令的集合,通过执行宏命令的方式,一次可以执行一批命令。 不管宏命令还是子命令,都有一个execute方法来执行命令。

在下面的例子中,基本对象可以被组合成更复杂的组合对象,组合对象又可以被组合,这样不断递归下去,这棵树的结构可以支持任意多的复杂度。在树最终被构造完成之后,让整颗树最终运转起来的步骤非常简单,只需要调用最上层对象的execute方法。每当对最上层的对象进行一次请求时,实际上是在对整个树进行深度优先的搜索,而创建组合对象的程序员并不关心这些内在的细节,往这棵树里面添加一些新的节点对象是非常容易的事情。

image.png

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