设计模式学习篇-组合模式

54 阅读1分钟

1.概念

又叫部分整体模式,将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让指代码的使用者可以统一单个对象和组合对象的处理逻辑。个人的简单理解就是把树的递归结构改成了线性单层结构

2. 为什么使用组合模式

  • 简化树形结构中对象的处理
  • 解耦客户端代码与复杂元素的内部结构,使得客户端可以统一处理所有类型的节点

3.代码实现

  • 举例实现动态地添加、删除某个目录下的子目录或文件;统计指定目录下的文件个数; 统计指定目录下的文件总大小
abstract class FileNode {
    protected path: string;

    constructor(path: string) {
        this.path = path;
    }

    public abstract countNumOfFiles(): number;

    public getPath(): string {
        return this.path;
    }
}

class MFile extends FileNode {
    public countNumOfFiles(): number {
        return 1;
    }
    constructor(path: string) {
        super(path);
    }
}

class MDirectory extends FileNode {
    private _subNodes: FileNode[] = [];

    constructor(path: string) {
        super(path);
    }
    public countNumOfFiles(): number {
        let num: number = 0;
        for (let i = 0; i < this._subNodes.length; i++) {
            num += this._subNodes[i].countNumOfFiles();
        }
        return num;
    }

    public addSubNode(node: FileNode) {
        this._subNodes.push(node);
    }

    public removeSubNode(node: FileNode) {
        let len = this._subNodes.length;
        for (let i = 0; i < len; i++) {
            if (this._subNodes[i] == node) {
                this._subNodes.splice(i, 1);
                break;
            }
        }
    }
}

let tree = new MDirectory("root");
let d = new MDirectory("root/d");
tree.addSubNode(d);
let f = new MFile("root/d/f.txt");
d.addSubNode(f);

let e = new MDirectory("root/e");
tree.addSubNode(e);
let g = new MFile("root/e/g.txt");
e.addSubNode(g);
console.log(tree.countNumOfFiles());