1 基础知识
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。特征:组合模式使得客户端对单个对象和组合对象保持一致的方式处理。
使用场景:希望客户端可以忽略组合对象与单个对象的差异;处理一个树形结构时。
优点:清楚定义分层次的复杂对象,表示对象的全部或部分层次;让客户端忽略了层次的差异,方便对整个层次结构控制;简化了客户端代码;符合开闭原则。缺点:限制类型时会比较复杂;使设计变得更加抽象。
2 代码示例:
使用场景:以慕课网为例,有一个Java课程目录,在这目录下有多种Java课程,如果把具体的Java课程继承课程目录那么就可以视课程目录与具体课程为同一对象操作。
抽象目录组件:CatalogComponent
public abstract class CatalogComponent { public void add(CatalogComponent catalogComponent){ throw new UnsupportedOperationException("不支持添加操作"); } public void remove(CatalogComponent catalogComponent){ throw new UnsupportedOperationException("不支持删除操作"); } public String getName(CatalogComponent catalogComponent){ throw new UnsupportedOperationException("不支持获取名称操作"); } public double getPrice(CatalogComponent catalogComponent){ throw new UnsupportedOperationException("不支持获取价格操作"); } public void print(){ throw new UnsupportedOperationException("不支持打印操作"); } }
课程类:Course
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; } @Override public double getPrice(CatalogComponent catalogComponent) { return this.price; } @Override public void print() { System.out.println("Course Name:"+name+" Price:"+price); } }
课程目录:CourseCatalog
public class CourseCatalog extends CatalogComponent { //在课程目录中会有许多课程,这些课程又属于目录组件 private List<CatalogComponent> items = new ArrayList<CatalogComponent>(); private String name; //为了使输出的排版更清晰 private Integer level; public CourseCatalog(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 remove(CatalogComponent catalogComponent) { items.remove(catalogComponent); } @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(); } } }
应用层:
public class Test { public static void main(String[] args) { CatalogComponent linuxCourse = new Course("Linux课程",11); CatalogComponent windowsCourse = new Course("Windows课程",11); //Java课程目录为2级目录 CatalogComponent javaCourseCatalog = new CourseCatalog("Java课程目录",2); CatalogComponent mmallCourse1 = new Course("Java电商一期",55); CatalogComponent mmallCourse2 = new Course("Java电商二期",66); CatalogComponent designPattern = new Course("Java设计模式",77); //把课程添加到java课程目录中 javaCourseCatalog.add(mmallCourse1); javaCourseCatalog.add(mmallCourse2); javaCourseCatalog.add(designPattern); //网站课程主目录级别为1 CatalogComponent imoocMainCourseCatalog = new CourseCatalog("慕课网课程主目录",1); imoocMainCourseCatalog.add(linuxCourse); imoocMainCourseCatalog.add(windowsCourse); imoocMainCourseCatalog.add(javaCourseCatalog); imoocMainCourseCatalog.print(); } }
输出效果:
类关系图如下图: 星号表示多个
0