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());