5、组合模式

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
以公司员工组织架构为例

[图片上传失败...(image-818266-1632387191971)]

  • 步骤一: 创建 Employee 类,该类带有 Employee 对象的列表。
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List subordinates;//下级

    public Employee(String name, String dept, int salary){
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        this.subordinates = new ArrayList<>();
    }

    public void add(Employee e){
        subordinates.add(e);
    }

    public void remove(Employee e) {
        subordinates.remove(e);
    }

    public List getSubordinates(){
        return subordinates;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", dept='" + dept + '\'' +
                ", salary=" + salary +
                '}';
    }
}
  • 步骤二: 创建 Employee 类,该类带有 Employee 对象的列表。
public class CompositePatternDemo {
    public static void main(String[] args) {
        Employee ceo = new Employee("name1", "CEO", 100000);

        Employee headSales = new Employee("name11", "Head Sales", 30000);
        Employee headMarketing  = new Employee("name12", "Head Marketing", 30000);

        Employee sale1 = new Employee("name111", "Sales", 10000);
        Employee sale2 = new Employee("name112", "Sales", 10000);

        Employee clerk1 = new Employee("name121", "Marketing", 10000);
        Employee clerk2 = new Employee("name122", "Marketing", 10000);

        ceo.add(headSales);
        ceo.add(headMarketing);
        headSales.add(sale1);
        headSales.add(sale2);
        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        //打印该组织的所有员工
        System.out.println(ceo);
        for (Employee sub : ceo.getSubordinates()) {
            System.out.println(sub);
            for (Employee sub2 : sub.getSubordinates()) {
                System.out.println(sub2);
            }
        }
    }
}

结果:

Employee{name='name1', dept='CEO', salary=100000}
Employee{name='name11', dept='Head Sales', salary=30000}
Employee{name='name111', dept='Sales', salary=10000}
Employee{name='name112', dept='Sales', salary=10000}
Employee{name='name12', dept='Head Marketing', salary=30000}
Employee{name='name121', dept='Marketing', salary=10000}
Employee{name='name122', dept='Marketing', salary=10000}

你可能感兴趣的:(5、组合模式)