js设想形式--组合形式

媒介

本系列文章重要依据《JavaScript设想形式与开辟实践》整顿而来,个中会加入了一些自身的思索。愿望对人人有所协助。

文章系列

js设想形式–单例形式

js设想形式–战略形式

js设想形式–代办形式

js设想形式–迭代器形式

js设想形式–宣布定阅形式

js设想形式–敕令形式

观点

组合形式就是用小的子对象来构建更大的对象,而这些小的子对象自身也许是由更小的“孙对象”组成的。

场景

组合形式除了请求组合对象和恭弘=叶 恭弘对象具有雷同的接口以外,另有一个必要条件,就是对一组恭弘=叶 恭弘对象的操纵必需具有一致性。

优瑕玷

长处

组合形式将对象组合成树形构造,以示意“部份-团体”的条理构造。 除了用来示意树形结 构以外,组合形式的另一个优点是经由过程对象的多态性表现,使得用户对单个对象和组合对象的使 器具有一致性

瑕玷

它可能会发生一个如许的体系:体系中的每一个对象看起来都 与其他对象差不多。它们的区分只要在运转的时刻会才会显现出来,这会使代码难以明白。另外, 假如经由过程组合形式创建了太多的对象,那末这些对象可能会让体系负担不起。

例子

扫描文件夹

这里把文件和文件夹无区分对待,文件和文件夹都具有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();
    原文作者:aoping
    原文地址: https://segmentfault.com/a/1190000017771997
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞