//组合模式 composite pattern 组合模式/合成模式/ part - whole 整体与部分模式。 把对象组合成树形结构,这样对象和组合对象的使用具有一致性。
interface Componet { //组件C公有的
doA: () => void;
}
class Composite implements Componet { //树/组
private array: Componet[] = []; //声明 数组
public addComponet(componet: Componet) {
this.array.push(componet);
}
public removeComponet(componet: Componet) {
YBLog.log("Test", " 删除之前 ", this.array.length);
this.array.forEach((item, index) => { //遍历 效率不高,因为每一个都遍历。
if (item === componet) {
this.array.splice(index, 1); //剪接 会返回原来的元素
YBLog.log("Test", " 删除之后 ", this.array.length);
}
});
}
public getComponetList() {
return this.array;
}
doA(): void {
YBLog.log("Test", "树 具体做事情");
this.array.forEach((item, index) => { //遍历 效率不高,因为每一个都遍历。
item.doA();
});
}
}
class Leaf implements Componet { //叶子
private s: string;
constructor(s: string) {
this.s = s;
}
doA():void
{
YBLog.log("Test", "叶 具体做事情", this.s);
}
}
let leaf1 = new Leaf("1");
let leaf2 = new Leaf("2");
let leaf3 = new Leaf("3");
let leaf4 = new Leaf("4");
let leaf5 = new Leaf("5");
let compositeA = new Composite();
let compositeB = new Composite();
compositeA.addComponet(leaf1)
compositeA.addComponet(leaf2)
compositeA.addComponet(leaf3)
compositeB.addComponet(leaf4)
compositeB.addComponet(leaf5)
compositeA.doA()
YBLog.log("Test", "------------------");
compositeB.doA()
YBLog.log("Test", "------------------");
compositeB.removeComponet(leaf4)
YBLog.log("Test", "------------------");
compositeB.doA()
// Test 树 具体做事情
// Test 叶 具体做事情 1
// Test 叶 具体做事情 2
// Test 叶 具体做事情 3
// Test ------------------
// Test 树 具体做事情
// Test 叶 具体做事情 4
// Test 叶 具体做事情 5
// Test ------------------
// Test 删除之前 2
// Test 删除之后 1
// Test ------------------
// Test 树 具体做事情
// Test 叶 具体做事情 5
//优点: 局部和整体都混合一起。 节点自由增加。
//缺点: 依赖倒置原则冲突了 :1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。2、抽象不应该依赖于细节,细节应该依赖于抽象。: 因为树的实现没有完全依赖抽象接口