再一次,javascript设计模式与开发实践-组合模式

简述

用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的”对象”构成的。

文件夹和文件的关系很适合用组合模式来描述,文件夹里包含文件,有可以包含其他文件夹,组合模式让ctrl+c,ctrl+v成了一个统一的操作。

使用场景

  • 目录
  • 级联选择
  • ..

案例

下面实现一个文件夹扫描功能,使用组合模式,我们并不需要关心文件夹内有多少文件,各个”子对象”能够自我处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* 文件夹 */
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, '===');
    this.files.forEach(function (v) {
        v.scan();
    });
};

/* 文件 */
var File = function (name) {
    this.name = name;
};

File.prototype.add = function () {
    throw new Error('文件下面不能添加文件');
};

File.prototype.scan = function () {
    console.log('找到:', this.name);
};


var folder1 = new Folder('娱乐');
var folder2 = new Folder('学习');
var folder3 = new Folder('系统');

var file1 = new File('GTA5');
var file2 = new File('深入浅出Node.js');
var file3 = new File('linux');

folder1.add(file1);
folder1.add(file2);
folder1.add(file3);


folder1.scan();
folder2.scan();
folder3.scan();