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的類圖: