JavaScript组合模式

组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性。结合命令模式可以构成宏命令。

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();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容