TypeScript(安全模式) 组合模式/合成模式/part - whole 整体与部分模式

//组合模式  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、抽象不应该依赖于细节,细节应该依赖于抽象。: 因为树的实现没有完全依赖抽象接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值