組合模式

組合模式

定義
  1. 將對象組合成樹形結構以表示「部分-總體」的層次結構。
  2. 組合模式是客戶端對單個對象和組合對象保持一致的方式處理。
類型
結構型
適用場景
  1. 但願客戶端能夠忽略組合對象與單個對象的差別是
  2. 處理一個樹形結構時
優勢
  1. 清楚地定義分層次的複雜對象,表示對象的所有或部分層次。
  2. 讓客戶端忽略了層次的差別,方便對整個層次結構進行控制。
  3. 簡化客戶端代碼

下面開始寫代碼,咱們首先假設一個業務場景,假設咱們有一個課程,這個課程裏面有不少課程包括java課程python等等,咱們定義一個抽象類,讓這些課程類繼承這個抽象類,那麼咱們就能夠認爲這些課程是一個對象。java

public abstract class CatalogComponent {
    public void add(CatalogComponent catalogComponent){
        throw new UnsupportedOperationException("不支持添加操做");
    }

    public void remove(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("不支持打印操做");
    }


}

這個就是抽象方法,至於咱們爲何要在這個抽象類中拋出異常呢?這個問題咱們等寫完了其餘的類再解答。python

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("Course Name:"+name+" Price:"+price);
    }

}

這是一個課程類,咱們繼承了抽象類,有價格和名稱兩個屬性。linux

public class CourseCatalog extends CatalogComponent {
    private List<CatalogComponent> items = new ArrayList<CatalogComponent>();
    private String name;
    private Integer level;


    public CourseCatalog(String name,Integer level) {
        this.name = name;
        this.level = level;
    }

    @Override
    public void add(CatalogComponent catalogComponent) {
        items.add(catalogComponent);
    }

    @Override
    public String getName(CatalogComponent catalogComponent) {
        return this.name;
    }

    @Override
    public void remove(CatalogComponent catalogComponent) {
        items.remove(catalogComponent);
    }

    @Override
    public void print() {
        System.out.println(this.name);
        for(CatalogComponent catalogComponent : items){
            if(this.level != null){
                for(int  i = 0; i < this.level; i++){
                    System.out.print("  ");
                }
            }
            catalogComponent.print();
        }
    }

}

這個是目錄類,有兩個屬性,層級和名稱。這個是咱們看到代碼,就解釋一下爲何在抽象類中要拋出異常,由於咱們的子類有的功能咱們都重寫了抽象類的方法,可是若是沒有重寫的方法也是被繼承了的。若是這時候被調用了,子類是沒有這個功能我但願不被調用因此就直接拋異常。最後咱們看看測試類的代碼。windows

public class CompositeTest {
    public static void main(String[] args) {
        CatalogComponent linuxCourse = new Course("Linux課程",11);
        CatalogComponent windowsCourse = new Course("Windows課程",11);

        CatalogComponent javaCourseCatalog = new CourseCatalog("Java課程目錄",2);

        CatalogComponent mmallCourse1 = new Course("Java設計模式一",55);
        CatalogComponent mmallCourse2 = new Course("Java設計模式二",66);
        CatalogComponent designPattern = new Course("Java設計模式三",77);

        javaCourseCatalog.add(mmallCourse1);
        javaCourseCatalog.add(mmallCourse2);
        javaCourseCatalog.add(designPattern);

        CatalogComponent imoocMainCourseCatalog = new CourseCatalog("課程主目錄",1);
        imoocMainCourseCatalog.add(linuxCourse);
        imoocMainCourseCatalog.add(windowsCourse);
        imoocMainCourseCatalog.add(javaCourseCatalog);

        imoocMainCourseCatalog.print();
    }
}

組合模式最大的問題在於要花代碼去判斷究竟是那一個類,由於咱們在使用的時候都是使用了父類對象。設計模式

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息