组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性。结合命令模式可以构成宏命令。
var Folder = function( name ){
this.name = name;
this.parent = null;
this.files = [];
}
Folder.prototype.add = function( file ){
file.parent = this; //设置父对象
this.files.push( file );
}
Folder.prototype.scan = function(){
console.log('开始扫描文件夹:' + this.name );
for( var i = 0,file,files = this.files;file = files[ i++ ]){
file.scan();
}
};
Folder.prototype.remove = function(){
if( !this.parent ){ //根节点或者树外的游离节点
return;
}
for( var files = this.parent.files,l = files.length - 1; l >= 0; l--){
var file = files[ l ];
if( file === this ){
files.splice( l,1 );
}
}
};
//文件对象与文件夹对象拥有统一方法名,抽象
var File = function( name ){
this.name = name;
this.parent = null;
};
File.prototype.add = function(){
throw new Error('不能添加在文件下面');
}
File.prototype.scan = function(){
console.log('开始扫描文件:' + this.name );
};
File.prototype.remove = function(){
if( !this.parent ){ //根节点或者树外的游离节点
return;
}
for( var files = this.parent.files, l = files.length - 1; l >= 0; l-- ){
var file = files[ l ];
if( file === this ){
files.splice( l, 1 );
}
}
};
//使用
var folder = new Folder('学习资料');
var folder1 = new Folder('JavaScript');
var file1 = new File('深入浅出Node.js');
folder.add( folder1 );
folder.add( file1 );
folder.remove(); //移除文件夹
folder.scan();
网友评论