結構型
下面開始寫代碼,咱們首先假設一個業務場景,假設咱們有一個課程,這個課程裏面有不少課程包括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(); } }
組合模式最大的問題在於要花代碼去判斷究竟是那一個類,由於咱們在使用的時候都是使用了父類對象。設計模式