# 设计模式:组合模式

# 什么是组合模式

将对象组成树装结构,分出从 “部分-->整体” 的层次。

# Coding

下面我们举一个蚂蚁搬家的例子

故事背景:某天傍晚,天空中乌云密布。蚁巢中的上上下下开始忙活着把家搬到较高的地方。

蚁后
  等待工蚁帮忙
工蚁
  去帮蚁后搬家
兵蚁
  指挥交通
繁殖蚁
  走在大部队的前面
var MacroCommand = function() {
  return {
    commandList: [],
    add: function(command) {
      this.commandList.push(command)
    },
    execute: function() {
      for (var i = 0, command; command = this.commandList[i]; i++) {
        command.execute();
      }
    }
  }
}

// 创建对象
// 工蚁 4
var antWork_1 = { execute: function() { console.log("工蚁:服侍蚁后搬家...") } }
var antWork_2 = { execute: function() { console.log("工蚁:服侍蚁后搬家...") } }
var antWork_3 = { execute: function() { console.log("工蚁:服侍蚁后搬家...") } }
var antWork_4 = { execute: function() { console.log("工蚁:服侍蚁后搬家...") } }

// 兵蚁 2
var antSoldier_1 = {
  execute: function() { console.log("兵蚁: 指挥交通...") }
}
var antSoldier_2 = {
  execute: function() { console.log("兵蚁: 指挥交通...") }
}
// 繁殖蚁 2
var antWoman_1 = {
  execute: function() { console.log("繁殖蚁: 走在大部队前面...") }
}
var antWoman_2 = {
  execute: function() { console.log("繁殖蚁: 走在大部队前面...") }
}

// 蚁后
var antQueen = MacroCommand()
antQueen.add(antWork_1)
antQueen.add(antWork_2)
antQueen.add(antWork_3)
antQueen.add(antWork_4)

// 命令:搬家
var moveHome = MacroCommand()
moveHome.add(antSoldier_1);
moveHome.add(antSoldier_1);
moveHome.add(antWoman_1);
moveHome.add(antWoman_2);
moveHome.add(antQueen);

document.getElementById( 'button' ).onclick = function(){
  moveHome.execute()
}

什么时候使用组合模式

当你的对象是树装结构的时候:比如省、市、区。此时用组合模式可以不仅可以表现出他们之间的关系,还能快速完成对某一个区域的操作。

# 总结

组合模式可以让我们用树形结构来管理对象,这样一来对象的批处理会很方便。

但是这样的系统会导致程序所占的内存越来越大,也会让对象之间的关系变得难以捉摸。

上次更新: 9/12/2020, 12:12:30 AM