组合模式

<button id="button">按我</button>
    <script>
      var MacroCommand = function () {
        return {
          commandsList: [],
          add: function (command) {
            console.log(command);

            this.commandsList.push(command);
          },
          execute: function () {
            for (var i = 0, command; (command = this.commandsList[i++]); ) {
              command.execute();
            }
          },
        };
      };
      var openAcCommand = {
        execute: function () {
          console.log("打开空调");
        },
      };
      /**********家里的电视和音响是连接在一起的,所以可以用一个宏命令来组合打开电视和打开音响的命令
       *********/
      var openTvCommand = {
        execute: function () {
          console.log("打开电视");
        },
      };
      var openSoundCommand = {
        execute: function () {
          console.log("打开音响");
        },
      };
      var macroCommand1 = MacroCommand();
      macroCommand1.add(openTvCommand);
      macroCommand1.add(openSoundCommand);
      /*********关门、打开电脑和打登录 QQ 的命令****************/
      var closeDoorCommand = {
        execute: function () {
          console.log("关门");
        },
      };
      var openPcCommand = {
        execute: function () {
          console.log("开电脑");
        },
      };
      var openQQCommand = {
        execute: function () {
          console.log("登录 QQ");
        },
      };
      var macroCommand2 = MacroCommand();
      macroCommand2.add(closeDoorCommand);
      macroCommand2.add(openPcCommand);
      macroCommand2.add(openQQCommand);

      /*********现在把所有的命令组合成一个“超级命令”**********/
      var macroCommand = MacroCommand();
      macroCommand.add(openAcCommand);
      macroCommand.add(macroCommand1);
      macroCommand.add(macroCommand2);
      /*********最后给遥控器绑定“超级命令”**********/
      var setCommand = (function (command) {
        document.getElementById("button").onclick = function () {
          command.execute();
        };
      })(macroCommand);
    </script>
原文地址:https://www.cnblogs.com/TTblog5/p/13162016.html