基础与定义
- 将对象组合成树形结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性
 - 组合模式使客户端对单个对西那个和组合对象保持一致的方式处理
 - 就是将多个对象组合成一个对象,简化对对象的访问
 - 类型:结构型
 
使用场景
- 处理一个树形结构
 - 希望客户端可以忽略组合对象与单个对象的差异时
 
优点:
- 清楚的定义层次的复杂对象
 - 让客户端忽略来层次的差异
 - 符合开闭原则
 
缺点:
- 限制类型时较为复杂
 - 设计更加抽象
 
源码实例
- map 中的 putAll
 - arrayList 中的 addAll
 
代码实例
public abstract class CatelogComponet {
    public void add(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持添加操作");
    }
    public void remove(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持删除操作");
    }
    public String getName(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持获取名称操作");
    }
    public double getPrice(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持获取价格添加操作");
    }
    public void print(){
        throw new UnsupportedOperationException("不支持打印操作");
    }
}
public class Course extends CatelogComponet {
    private String name;
    private double price;
    public Course(String name, double price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public String getName(CatelogComponet catelogComponet) {
        return this.name;
    }
    @Override
    public double getPrice(CatelogComponet catelogComponet) {
        return this.price;
    }
    @Override
    public void print() {
        System.out.println("Course Name :"+name+" price :"+price);
    }
}
public class CourseCatelog extends CatelogComponet {
    private List<CatelogComponet> items = new ArrayList<>();
    private String name;
    public CourseCatelog(String name) {
        this.name = name;
    }
    @Override
    public String getName(CatelogComponet catelogComponet) {
        return name;
    }
    @Override
    public void add(CatelogComponet catelogComponet) {
        items.add(catelogComponet);
    }
    @Override
    public void remove(CatelogComponet catelogComponet) {
        items.remove(catelogComponet);
    }
    @Override
    public void print() {
        System.out.println(this.name);
        for (CatelogComponet c : items){
            System.out.print("  ");
            c.print();
        }
    }
}
public class Test {
    public static void main(String[] args){
        CatelogComponet linuxCourse = new Course("linux",11);
        CatelogComponet windowsCourse = new Course("windows",11);
        CatelogComponet javaCatelog= new CourseCatelog("java");
        CatelogComponet javaCatelog1 = new Course("java 1",11);
        CatelogComponet javaCatelog2 = new Course("java 2",22);
        CatelogComponet javaCatelog3 = new Course("java 3",44);
        // 添加课程到课程目录
        javaCatelog.add(javaCatelog1);
        javaCatelog.add(javaCatelog2);
        javaCatelog.add(javaCatelog3);
        CatelogComponet immocMainCourse = new CourseCatelog("主目录");
        immocMainCourse.add(linuxCourse);
        immocMainCourse.add(windowsCourse);
        immocMainCourse.add(javaCatelog);
        immocMainCourse.print();
    }
}