9) Composite Pattern

发布时间 2023-06-06 13:27:42作者: zno2

类别:

 Structual Pattern

问题:

 

方案:

 

 

 

示例:

 

import java.util.ArrayList;
import java.util.List;

public class CompositePatternDemo {
    public static void main(String[] args) {
        Body sun = new Body("太阳", "恒星", 1392000000);
        Body mercury = new Body("水星", "行星", 4878000 );
        Body venus = new Body("金星", "行星", 12103600 );
        Body earth = new Body("地球", "行星", 12756300);
        Body moon = new Body("月球", "卫星", 3476280);
        Body mars = new Body("火星", "行星", 6794000);
        Body jupiter = new Body("木星", "行星", 142984000);
        Body saturn = new Body("土星", "行星", 120536000);
        Body saturnMoon1 = new Body("土卫一", "行星", 392000);
        Body saturnMoon2 = new Body("土卫二", "行星", 500000);
        Body uranus = new Body("天王星", "行星", 51120000);
        Body neptune = new Body("海王星", "行星", 49528000);
        
        sun.add(mercury);
        sun.add(venus);
        sun.add(earth);
        sun.add(mars);
        sun.add(jupiter);
        sun.add(saturn);
        sun.add(uranus);
        sun.add(neptune);
        earth.add(moon);
        saturn.add(saturnMoon1);
        saturn.add(saturnMoon2);
        
        System.out.println(sun);
        for (Body planet : sun.getSubLevelList()) {
            System.out.println(planet);
            for (Body satellite : planet.getSubLevelList()) {
                System.out.println(satellite);
            }
        }
    }
}

class Body {
    private String name;
    private String level;
    private int diameter;
    private List<Body> subLevelList;

    public Body(String name, String level, int diameter) {
        this.name = name;
        this.level = level;
        this.diameter = diameter;
        subLevelList = new ArrayList<Body>();
    }

    public void add(Body e) {
        subLevelList.add(e);
    }

    public void remove(Body e) {
        subLevelList.remove(e);
    }

    public List<Body> getSubLevelList() {
        return subLevelList;
    }

    @Override
    public String toString() {
        return "Body [name=" + name + ", level=" + level + ", diameter=" + diameter + "]";
    }

}

 

Body [name=太阳, level=恒星, diameter=1392000000]
Body [name=水星, level=行星, diameter=4878000]
Body [name=金星, level=行星, diameter=12103600]
Body [name=地球, level=行星, diameter=12756300]
Body [name=月球, level=卫星, diameter=3476280]
Body [name=火星, level=行星, diameter=6794000]
Body [name=木星, level=行星, diameter=142984000]
Body [name=土星, level=行星, diameter=120536000]
Body [name=土卫一, level=行星, diameter=392000]
Body [name=土卫二, level=行星, diameter=500000]
Body [name=天王星, level=行星, diameter=51120000]
Body [name=海王星, level=行星, diameter=49528000]

 

应用:

 

不足:(

 

优化:)