基础与定义
- 将对象组合成树形结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性
- 组合模式使客户端对单个对西那个和组合对象保持一致的方式处理
- 就是将多个对象组合成一个对象,简化对对象的访问
- 类型:结构型
使用场景
- 处理一个树形结构
- 希望客户端可以忽略组合对象与单个对象的差异时
优点:
- 清楚的定义层次的复杂对象
- 让客户端忽略来层次的差异
- 符合开闭原则
缺点:
- 限制类型时较为复杂
- 设计更加抽象
源码实例
- 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();
}
}