1 概念 1 定义 将对象组合成树形结构以表示“部分——整体”的层次结构
组合模式使客户端对单个对象和组合对象保持一致的处理方式
类型:结构型
2 适用场景
希望客户端可以忽略组合对象和单个对象之前的差异
处理树形结构时
3 优缺点 优点
让客户端忽略了层次的差异,方便对整个层次进行控制。简化客户端代码
符合开闭原则
缺点
2 代码实现 场景:打印课程目录和课程的层次关系。课程的主目录包括课程目录和课程。
有些课程属于某个子目录下,有些无法归类到子目录,直属于主目录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public abstract class CatalogComponent { public void add (CatalogComponent catalogComponent) { throw new UnsupportedOperationException("不支持添加操作" ); } public String getName (CatalogComponent catalogComponent) { throw new UnsupportedOperationException("不支持获取名称操作" ); } public void print () { throw new UnsupportedOperationException("不支持打印操作" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class Course extends CatalogComponent { private String name; private double price; public Course (String name, double price) { this .name = name; this .price = price; } @Override public String getName (CatalogComponent catalogComponent) { return this .name; } public double getPrice (CatalogComponent catalogComponent) { return this .price; } @Override public void print () { System.out.println("Course Name:" +name+" Price:" +price); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class Catalog extends CatalogComponent { private List<CatalogComponent> items = new ArrayList<CatalogComponent>(); private String name; private Integer level; public Catalog (String name, Integer level) { this .name = name; this .level = level; } @Override public void add (CatalogComponent catalogComponent) { items.add(catalogComponent); } @Override public String getName (CatalogComponent catalogComponent) { return this .name; } @Override public void print () { System.out.println(this .name); for (CatalogComponent catalogComponent : items){ if (this .level != null ){ for (int i = 0 ; i < this .level; i++){ System.out.print(" " ); } } catalogComponent.print(); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Test { public static void main (String[] args) { CatalogComponent linuxCourse = new Course("Linux课程" ,11 ); CatalogComponent windowsCourse = new Course("Windows课程" ,11 ); CatalogComponent javaCourseCatalog = new Catalog("Java课程目录" ,2 ); CatalogComponent mmallCourse1 = new Course("Java电商一期" ,55 ); CatalogComponent mmallCourse2 = new Course("Java电商二期" ,66 ); CatalogComponent designPattern = new Course("Java设计模式" ,77 ); javaCourseCatalog.add(mmallCourse1); javaCourseCatalog.add(mmallCourse2); javaCourseCatalog.add(designPattern); CatalogComponent mainCourseCatalog = new Catalog("课程主目录" ,1 ); mainCourseCatalog.add(linuxCourse); mainCourseCatalog.add(windowsCourse); mainCourseCatalog.add(javaCourseCatalog); mainCourseCatalog.print(); } }
输出: