Java設計模式之組合模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章