组合模式

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15

本文参考:参考1 参考2

组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示“部分整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式先将模块整体拆分出个体,然后需要时寻找相应的个体组合成新的整体。组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的。所以组合模式不仅仅是单层次的,也可以是一个多层次的。

叶对象可以组合成更复杂的组合对象,组合对象又可以被组合,这样不断递归下去,这棵树的结构可以支持任意多的复杂度,需要注意的是,组合对象和叶对象并不是父子关系,只是树形结构。

主要解决:模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用:1、想表示对象的部分-整体层次结构 2、希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:组合对象和叶对象实现统一接口,组合对象内部组合该接口。

// 开门
var openDoor = {
  execute() {
    console.log('开门');
  }
}

// 开空调
var openAirConditioner = {
  execute() {
    console.log('开空调');
  }
}

// 开电脑
var openPc = {
  execute() {
    console.log('开电脑');
  }
}

// 宏命令,组合多个子命令
var MacroCommand = function () {
  return {
    commandList: [],
    add(command) {
      this.commandList.push(command);
      return this;
    },
    // 依次执行命令列表
    execute() {
      for (var i = 0, l = this.commandList.length; i < l; i++) {
        this.commandList[i].execute();
      }
    }
  }
}

var goHome = MacroCommand().add(openDoor).add(openAirConditioner).add(openPc); // 组合叶对象为一个组合对象

var playGames = {
  execute() {
    console.log('打游戏');
  }
}

var happyTime = MacroCommand().add(goHome).add(playGames); // 组合 组合对象与叶对象 为更复杂的组合对象
happyTime.execute();