javascript设计模式笔记-9 组合模式

简述

  • 组合模式是将一系列类似的小对象组合成大的对象,由这个大对象提供接口来对里面的小对象进行操作。
  • 组合模式可以理解为树状结构。
  • 因此组合模式适合对大批对象的操作,特别是层次结构分明的。

组合模式例子

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function ImagesStore (id) {
    this.children = [];

    this.element = document.createElement('div');
    this.element.id = id;
    this.element.className = 'imgs-store';
}
ImagesStore.prototype = {
    constructor: ImagesStore,

    add: function (child) {
        this.children.push(child);
        this.element.appendChild(child.getElement());
    },

    remove: function (child) {
            for(var node, i = 0; node = this.getChild(i); i++) {
            if(node === child) {
                this.children.splice(i, 1);
                break;
            }
            this.element.removeChild(child.getElement());
        }
    },

    getChild: function (i) {
        return this.children[i];
    },

    getElement: function () {
        return this.element;
    },

    show: function () {
        this.element.style.display = '';
        for(var node, i = 0; node = this.getChild(i); i++) {
            node.show();
        }
    },

    hide: function () {
        for(var node, i = 0; node = this.getChild(i); i++) {
            node.hide();
        }
        this.element.style.display = 'none';
    }
};

function ImageItem (src) {
    this.element = document.createElement('img');
    this.element.src = src;
    this.element.className = 'img-item';
}

ImageItem.prototype = {
    constructor: ImagesStore,

    getElement: function () {
        return this.element;
    }
};

var store = new ImagesStore('imgs');
store.add(new ImageItem('1.jpg'));
store.add(new ImageItem('2.jpg'));

document.body.appendChild(store.element);