设计模式 组合模式

目录

一 介绍

二 示例和代码


一 介绍

又叫做整体-部分模式

属于结构型设计模式。

定义:

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要优点:

1 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象还是组合对象。简化了客户端代码。
2 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。

适用场景:

描述整体与部分的关系时。


二 示例和代码

比如要统计一个中学的全校学生人数,学校是包括年级的,年级又包括班级,学校--年级--班级 就是整体与部分的关系,我们可以先汇总班级的人数,得到年级的人数,再汇总年级的人数,得到全校总共的人数。

package com.qing.compose;

public interface ICounter {
    int count();
}
package com.qing.compose;

public class Classes implements ICounter {
    private int sum = 0;

    public Classes(int sum) {
        this.sum = sum;
    }

    @Override
    public int count() {
        return sum;
    }
}
package com.qing.compose;

import java.util.ArrayList;
import java.util.List;

public class Container implements ICounter {
    private List<ICounter> list = new ArrayList<>();

    public void add(ICounter counter) {
        list.add(counter);
    }

    public void remove(ICounter counter) {
        list.remove(counter);
    }

    public List<ICounter> getList() {
        return list;
    }

    @Override
    public int count() {
        int sum = 0;
        for (ICounter counter : list) {
            sum += counter.count();
        }
        return sum;
    }
}

测试

package com.qing.compose;

public class Test1 {
    public static void main(String[] args) {
        Container school = new Container();
        //一年级
        Container grade1=new Container();
        //一年级有2个班级
        grade1.add(new Classes(40));
        grade1.add(new Classes(50));
        //二年级
        Container grade2=new Container();
        //二年级有2个班级
        grade2.add(new Classes(45));
        grade2.add(new Classes(43));
        //三年级
        Container grade3=new Container();
        //三年级有3个班级
        grade3.add(new Classes(32));
        grade3.add(new Classes(30));
        grade3.add(new Classes(28));
        //学校总共有3个年级
        school.add(grade1);
        school.add(grade2);
        school.add(grade3);
        System.out.println(school.count());
    }
}

结果