轻松掌握:JavaScript组合模式

组合模式

组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一。

基本单元:一个组合对象包含多个叶对象。每个基本单元又可以是别的组合对象的叶对象

类似文件夹与它里面的内容的关系网,一个文件夹或文件又可以是其它文件夹的内容,但一个文件夹或文件不能同时属于多个上级文件夹。

在JavaScript中实现组合模式时,要保证组合对象和叶对象拥有相同的接口方法,对同一组叶对象的操作必须具有一致性。

例子:

//定义组合对象
var Folder = function (name) {
    this.name = name;
    this.parent = null;
    this.files = [];
};
Folder.prototype.add = function (file) {
    file.parent = this;
    if(this.files.indexOf(file) === -1){
        this.files.push(file);
    }else{
        console.log('\''+file.name+'\'已存在,添加失败');
    }
};
Folder.prototype.scan = function () {
    if(this.parent){
        console.log('开始扫描\''+this.parent.name+'\': '+this.name);
    }else{
        console.log('开始扫描根目录: '+this.name);
    }
    //关键在这里,调用所有它的叶对象的接口方法scan()
    for(var i = 0, file; file = this.files[i++];){
        file.scan();
    }
};
Folder.prototype.remove = function (file) {
    var n = this.files.indexOf(file);
    if(n === -1){console.log('无法删除: \''+file.name+'\'不存在:');}
    if(n >= 0){
        this.files.splice(n,1);
        console.log('成功删除:'+file.name);
    }
};
//定义叶对象
var File = function (name) {
    this.name = name;
    this.parent = null;
};
File.prototype.add = function () {
    console.log('不能添加在文件下面');
};
File.prototype.scan = function () {
    console.log(this.parent.name+': '+this.name);
};
File.prototype.remove = function (file) {
    console.log('无法删除: \''+file.name+'\'不存在:');
};
//测试
var folder = new Folder('目录');

var folder1 = new Folder('学习质料');
var folder2 = new Folder('javascript');
var file1 = new File('Node.js');
var file2 = new File('qq.jpg');

folder.add(folder1);
folder.add(folder1);
folder.add(folder2);
folder1.add(file1);
folder2.add(file2);

//'学习质料'添加成功
//'学习质料'已存在,添加失败
//'javascript'添加成功
//'Node.js'添加成功
//'qq.jpg'添加成功

folder.remove(folder1);
folder.remove(folder1);
file1.remove(file1);

//成功删除:学习质料
//无法删除: '学习质料'不存在:
//无法删除: 'Node.js'不存在:

folder.scan(); //这里相当于执行了一个宏命令

//开始扫描根目录: 目录
//开始扫描'目录': javascript
//javascript: qq.jpg

参考文献: 《JavaScript模式》 《JavaScript设计模式与开发实践》

posted on 2016-08-26 12:49  SuriFuture  阅读(399)  评论(0编辑  收藏  举报

导航