1. 定义
优点
缺点
2. 对象具有层次结构,客户端看不见层次关系
一个目录抽象类
目录:此时产生了子目录items,存在递归关系。
/**
* 课程目录
*/
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) {
// 2级子目录
CatalogComponent javaBasisCourseCatalog = new CourseCatalog("Java实战课程目录",2);
CatalogComponent springCourse = new Course("Spring课程",11);
CatalogComponent mybatisCourse = new Course("mybatis课程",11);
javaBasisCourseCatalog.add(springCourse);
javaBasisCourseCatalog.add(mybatisCourse);
//2级子目录
CatalogComponent javaActualCombatCourseCatalog = new CourseCatalog("Java实战课程目录",2);
CatalogComponent mmallCourse1 = new Course("Java电商一期",55);
CatalogComponent mmallCourse2 = new Course("Java电商二期",66);
CatalogComponent designPattern = new Course("Java设计模式",77);
javaActualCombatCourseCatalog.add(mmallCourse1);
javaActualCombatCourseCatalog.add(mmallCourse2);
javaActualCombatCourseCatalog.add(designPattern);
//1级目录
CatalogComponent imoocMainCourseCatalog = new CourseCatalog("java后端课程主目录",1);
imoocMainCourseCatalog.add(javaBasisCourseCatalog);
imoocMainCourseCatalog.add(javaActualCombatCourseCatalog);
imoocMainCourseCatalog.print();
}
}
组合模式对Test客户端的使用来说就是单纯的打印,在CourseCatalog封装了一个递归的打印操作。对客户端来说,无论打印哪个目录都是imoocMainCourseCatalog.print();
源码:https://github.com/LUK-qianliu/design_pattern_in_all