Java设计模式之组合模式
考虑这样一个场景,某视频学习网站,有很多课程,也有很多课程目录,课程有名称,有价格。比如Java课程目录有很多Java课程,Android课程目录有很多Android课程,如果让课程和课程目录都继承某个抽象类,比如课程组件,就可以把课程和课程目录视为同一对象进行操作。具体操作有共同的地方,也有不同的地方。下面看看具体实现过程。
//创建抽象类目录组件,然后创建课程和课程目录来继承此类
public abstract class CatalogComponent {
public void add(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持添加操作");
}
public void delete(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("不支持打印操作");
}
}
//课程类,课程下面不能再添加课程,也不能再删除课程,因此没有add()方法和delete()方法。
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("课程名称:"+name+" 价格:"+price);
}
}
//课程目录类,假如目录里面不支持获取名称getName()方法和获取价格getPrice()方法
public class CourseCatalog extends CatalogComponent{
private String name;
List<CatalogComponent> items=new ArrayList<>();
public CourseCatalog(String name) {
this.name = name;
}
@Override
public void add(CatalogComponent catalogComponent) {
items.add(catalogComponent);
}
@Override
public void delete(CatalogComponent catalogComponent) {
items.remove(catalogComponent);
}
@Override
public void print() {
System.out.println(this.name);
for(CatalogComponent catalogComponent:items){
System.out.print(" ");
catalogComponent.print();
}
}
}
//调用
public static void main(String[] a){
CatalogComponent couurs1=new Course("Linux课程",188);
CatalogComponent couurs2=new Course("Windows课程",288);
CatalogComponent javaCatalog=new CourseCatalog("Java课程目录");
CatalogComponent course3=new Course("Java入门课程",199);
CatalogComponent course4=new Course("Java进阶课程",299);
CatalogComponent course5=new Course("Java高级课程",199);
javaCatalog.add(course3);
javaCatalog.add(course4);
javaCatalog.add(course5);
CatalogComponent mainCatolog=new CourseCatalog("课程主目录");
//mainCatolog既可以添加课程类,也可以添加课程目录类。这就是组合模式的核心。即叶子对象(课程类)和组合对象(课程目录类)继承相同的抽象类(或实现相同的接口)。
mainCatolog.add(couurs1);
mainCatolog.add(couurs2);
mainCatolog.add(javaCatalog);
mainCatolog.print();
}
//结果
课程主目录
课程名称:Linux课程 价格:188.0
课程名称:Windows课程 价格:288.0
Java课程目录
课程名称:Java入门课程 价格:199.0
课程名称:Java进阶课程 价格:299.0
课程名称:Java高级课程 价格:199.0
此时UML的类图: