媒介
本系列文章重要依据《JavaScript设想形式与开辟实践》整顿而来,个中会加入了一些自身的思索。愿望对人人有所协助。
文章系列
观点
组合形式就是用小的子对象来构建更大的对象,而这些小的子对象自身也许是由更小的“孙对象”组成的。
场景
组合形式除了请求组合对象和恭弘=叶 恭弘对象具有雷同的接口以外,另有一个必要条件,就是对一组恭弘=叶 恭弘对象的操纵必需具有一致性。
优瑕玷
长处
组合形式将对象组合成树形构造,以示意“部份-团体”的条理构造。 除了用来示意树形结 构以外,组合形式的另一个优点是经由过程对象的多态性表现,使得用户对单个对象和组合对象的使 器具有一致性
瑕玷
它可能会发生一个如许的体系:体系中的每一个对象看起来都 与其他对象差不多。它们的区分只要在运转的时刻会才会显现出来,这会使代码难以明白。另外, 假如经由过程组合形式创建了太多的对象,那末这些对象可能会让体系负担不起。
例子
扫描文件夹
这里把文件和文件夹无区分对待,文件和文件夹都具有add和scan要领
var Folder = function (name) {
this.name = name;
this.files = [];
};
Folder.prototype.add = function (file) {
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();
}
};
/******************************* File ******************************/
var File = function (name) {
this.name = name;
};
File.prototype.add = function () {
throw new Error('文件下面不能再增添文件');
};
File.prototype.scan = function () {
console.log('最先扫描文件: ' + this.name);
};
var folder = new Folder('进修材料');
var folder1 = new Folder('JavaScript');
var folder2 = new Folder('jQuery');
var file1 = new File('JavaScript 设想形式与开辟实践');
var file2 = new File('通晓jQuery');
var file3 = new File('重构与形式')
folder1.add(file1);
folder2.add(file2);
folder.add(folder1);
folder.add(folder2);
folder.add(file3);
var folder3 = new Folder('Nodejs');
var file4 = new File('深入浅出Node.js');
folder3.add(file4);
var file5 = new File('JavaScript 言语精华与编程实践');
folder.add(folder3);
folder.add(file5);
folder.scan();
增添删除要领
我们须要增添一个父对象的援用
var Folder = function (name) {
this.name = name;
this.parent = null; //增添this.parent 属性
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 Folder('深入浅出Node.js');
folder1.add(new File('JavaScript 设想形式与开辟实践'));
folder.add(folder1);
folder.add(file1);
folder1.remove(); //移除文件夹
folder.scan();