1. 概述
2. 代码解析<把多个对象组合成为一个对象, 方便调用.>
public abstract class CatalogComponent {
public void add(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不能添加");
}
public void remove(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不能删除");
}
public String getName() {
throw new UnsupportedOperationException("无法获取名称");
}
public BigDecimal getPrice() {
throw new UnsupportedOperationException("无法获取价格");
}
public void print() {
throw new UnsupportedOperationException("无法打印");
}
}
/**
* 只实现该对象需要操作的方法, 这样调用其它不属于该对象的方法就会抛出异常.
*/
public class Course extends CatalogComponent {
private String name;
private BigDecimal price;
public Course(String name, BigDecimal price) {
this.name = name;
this.price = price;
}
@Override
public String getName() {
return this.name;
}
@Override
public BigDecimal getPrice() {
return this.price;
}
@Override
public void print() {
System.out.println("Name:" + this.name + ", price: " + this.price);
}
}
/**
* 只实现该对象需要操作的方法, 这样调用其它不属于该对象的方法就会抛出异常.
*/
public class CourseCatalog extends CatalogComponent {
private List<CatalogComponent> course_group = new ArrayList<>();
private String name;
private Integer level;
public CourseCatalog(String name, Integer level) {
this.name = name;
this.level = level;
}
@Override
public void add(CatalogComponent catalogComponent) {
this.course_group.add(catalogComponent);
}
@Override
public void remove(CatalogComponent catalogComponent) {
this.course_group.remove(catalogComponent);
}
@Override
public void print() {
System.out.println("Catalog: " + this.name);
for (CatalogComponent item : this.course_group) {
if (this.level != null) {
int index = 0;
while (index < this.level) {
System.out.print(" ");
index++;
}
}
item.print();
}
}
}
/**
* 组合模式:
* 1. CatalogComponent里面包含了CourseCatalog和Course两者的抽象接口;
* 2. CourseCatalog和Course实现属于自己的接口;
* 3. 因为使用的是面向接口编程, 因此, 屏蔽了底层不同的实现;
*/
public class CompositeTest {
public static void main(String[] args) {
CatalogComponent linuxCourse = new Course("Linux", new BigDecimal("13"));
CatalogComponent win10Course = new Course("WIN10", new BigDecimal("14"));
CatalogComponent javaCatalog = new CourseCatalog("JAVA类课程", 2);
CatalogComponent redisCourse = new Course("Redis", new BigDecimal("12312"));
CatalogComponent mqCourse = new Course("RabbitMq", new BigDecimal("1213"));
CatalogComponent JVMCourse = new Course("JVM", new BigDecimal("13"));
javaCatalog.add(redisCourse);
javaCatalog.add(mqCourse);
javaCatalog.add(JVMCourse);
CatalogComponent mainCatalog = new CourseCatalog("慕课主目录", 1);
mainCatalog.add(linuxCourse);
mainCatalog.add(win10Course);
mainCatalog.add(javaCatalog);
mainCatalog.print();
}
}
3. 源码使用
- JDK中的
ArrayList.addAll(Collection<? extends E> c)
;