组合模式
定义
组合模式又叫整体-部分模式,它允许你将对象组合成树形结构来表现整体-部分层次结构,让使用者可以以一致的方式处理组合对象以及部分对象。
示例
var closeDoorCommand = {
execute: function(){
console.log("关门");
}
};
var openPcCommand = {
execute: function(){
console.log("打开电脑");
}
};
var openQQCommand = {
execute: function(){
console.log("登录QQ");
}
};
var openAcCommand = {
execute: function() {
console.log("打开空调");
}
}
var openTvCommand = {
execute: function() {
console.log("打开电视");
}
}
var openSoundCommand = {
execute: function() {
console.log("打开音响");
}
}
var MacroCommand = function(){
return {
commandsList: [],
add: function(command){
this.commandsList.push(command);
},
execute: function(){
for(var i = 0, command; command = this.commandsList[i++];) {
command.execute();
}
}
}
};
var macroCommand1 = MacroCommand();
macroCommand1.add(openTvCommand);
macroCommand1.add(openSoundCommand);
var macroCommand2 = MacroCommand();
macroCommand2.add(closeDoorCommand);
macroCommand2.add(openPcCommand);
macroCommand2.add(openQQCommand);
var macroCommand = MacroCommand();
macroCommand.add(openAcCommand);
macroCommand.add(macroCommand1);
macroCommand.add(macroCommand2);
macroCommand.execute();
用途
组合模式将对象组合成树形结构,以表示 “部分-整体” 的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性,下面分别说明:
- 表示树形结构:此模式提供了一种遍历树形结构的方案,通过调用组合对象的 execute 方法,程序会递归调用组合对象下面的子对象的 execute 方法,所以我们的万能遥控器只需操作一次,便能一次完成关门、打开电脑、登录QQ这几件事。非常方便地描述对象部分-整体层次结构。
- 利用对象多态性统一对待组合对象和单个对象。
优缺点
组合模式的优点:
- 由于组合对象和子对象具有同样的接口,因此调用的是组合对象还是子对象对使用者来说没有区别,使得使用者面向接口编程;
- 如果想在组合模式的树中增加一个节点比较容易,在目标组合对象中添加即可,不会影响到其他对象,对扩展友好,符合开闭原则,利于维护;
组合模式的缺点:
- 增加了系统复杂度,如果树中对象不多,则不一定需要使用;
- 如果通过组合模式创建了太多的对象,那么这些对象可能会让系统负担不起;
适用场景
- 如果对象组织呈树形结构就可以考虑使用组合模式,特别是如果操作树中对象的方法比较类似时;
- 使用者希望统一对待树形结构中的对象,比如用户不想写一堆 if-else 来处理树中的节点时,可以使用组合模式;