2、书籍类
书籍类 重写了 CatalogComponent 的 getName / getPrice / printf 方法 , 如果调用其余方法 , 会抛出异常 ;
package composite; /** * 书籍类 * 重写了 CatalogComponent 的 getName / getPrice / printf 方法 * 如果调用其余方法 , 会抛出异常 */ public class Book extends CatalogComponent { /** * 书籍名称 */ private String name; /** * 书籍价格 */ private double price; public Book(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 printf() { System.out.println("Book : name = " + name + " , price = " + price); } }
3、目录类
目录类 重写了 CatalogComponent 的 getName / add / remove / printf 方法 , 如果调用其余方法 , 会抛出异常 ;
package composite; import java.util.ArrayList; /** * 目录类 * 重写了 CatalogComponent 的 getName / add / remove / printf 方法 * 如果调用其余方法 , 会抛出异常 */ public class Catalogue extends CatalogComponent { /** * 维护书籍列表 */ private ArrayList<CatalogComponent> items = new ArrayList<>(); /** * 书籍名称 */ private String name; /** * 存储当前目录的层数 * 最外面的是 0 层 */ private Integer level; public Catalogue(String name, Integer level) { this.name = name; this.level = level; } @Override public String getName(CatalogComponent catalogComponent) { return this.name; } @Override public void add(CatalogComponent catalogComponent) { items.add(catalogComponent); } @Override public void remove(CatalogComponent catalogComponent) { items.remove(catalogComponent); } @Override public void printf() { System.out.println(this.name + " : "); for (CatalogComponent catalogComponent : items) { // 这样可以将目录层次完整的打印出来 if (this.level != null) { for (int i = 0; i < level; i++) { System.out.print(" "); } } catalogComponent.printf(); } } }
4、测试类
package composite; public class Main { public static void main(String[] args) { // 认为 书籍 和 目录 都是 CatalogComponent 类型的 CatalogComponent storyBook = new Book("故事书", 2.0); CatalogComponent novelBook = new Book("小说", 8.0); CatalogComponent mathBook = new Book("数学书", 7.0); CatalogComponent englishBook = new Book("英语书", 3.0); CatalogComponent schoolBooks = new Catalogue("学校课本", 2); schoolBooks.add(mathBook); schoolBooks.add(englishBook); // 主目录 , 包含上述所有内容 , 2 本书 和 1 个目录 CatalogComponent main = new Catalogue("所有书籍", 1); main.add(storyBook); main.add(novelBook); main.add(schoolBooks); // 打印主目录 main.printf(); } }
执行结果 :
所有书籍 : Book : name = 故事书 , price = 2.0 Book : name = 小说 , price = 8.0 学校课本 : Book : name = 数学书 , price = 7.0 Book : name = 英语书 , price = 3.0