JavaScript组合模式

2021-01-01  本文已影响0人  晓蟲QwQ

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

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();
上一篇 下一篇

猜你喜欢

热点阅读