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的类图:

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