本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15
组合模式(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();