组合模式的用途
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。 除了用来表示树形结
构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使
用具有一致性,下面分别说明。
- 组合模式提供了一个树状数据的遍历解决方法,很容易表示部分-整体的结构。
- 组合模式使得用户对待单个数据和组合数据有着相同的操作方式,忽略部分和整体的差异性。
回顾宏命令
在前面的命令模式讲解中,我们定义了一个宏命令类,用于执行一组命令
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();
}
}
}
};
复制代码
这里由于每一个命令都具有excute()方法,所以宏命令只是做了一个代理的操作。
实现更强大的宏命令
由于宏命令和单个命令的暴露方法相同,用户不需要知道执行的是什么命令,我们可以借助这个特性来实现更强大的宏命令,即宏命令中我们可以继续添加宏命令,这样下去便会构造出一棵树级指令,启动它的方式也很简单,只需要调用最上级的方法就可以了。
使用场景:遍历文件
假如有这样一个场景,我们将文件存放在文件夹里面,然后文件夹里面也能存放文件。现在如果我们需要对每一个文件杀毒,即遍历每个文件。
这种情况我们就完全可以使用组合模式来做。
我们先定义文件夹类
var Folder = function(name){
this.name = name;
this.fileLsit = [];
}
Folder.prototype.add = function(file){
this.fileLsit.push(file);
}
Folder.prototype.excute = function(){
console.log("遍历文件夹"+this.name+":");
this.fileLsit.map(item => item.excute());
}
复制代码
然后是文件类
var File = function(name){
this.name = name;
}
File.prototype.add = function(){
throw new Error("File can't add File");
}
File.prototype.excute = function(){
console.log("遍历文件",this.name);
}
复制代码
之后我们创建一个树状文件结构
var folder_C = new Folder("C盘");
var file_JS = new File("JS从入门到精通");
var file_Node = new File("nodeJS");
folder_C.add(file_JS);
folder_C.add(file_Node);
var folder_study = new Folder("学习文件夹h");
var file_TS = new File("TS从入门到精通");
var file_C = new File("C语言学习");
folder_study.add(file_TS);
folder_study.add(file_C);
folder_C.add(folder_study);
folder_C.excute();
复制代码
打印结果
遍历文件夹C盘
遍历文件 JS从入门到精通
遍历文件 nodeJS
遍历文件夹学习文件夹
遍历文件 TS从入门到精通
遍历文件 C语言学习
复制代码
优点
组合模式最大的优点在于可以一致地对待组合对象和基本对象。客户不需要知道
当前处理的是宏命令还是普通命令,只要它是一个命令,并且有 execute 方法,这个命令就可以
被添加到树中。
总结
本文简单介绍了组合模式和他的一个实践,只要需求有以下特点,你都可以考虑组合模式:
- 你想表示对象的部分-整体层次结构时;
- 你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象(方法)
感谢看到这里,不妨留个赞再走呀~~~
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END