前言

博主github

博主个人博客http://blog.healerjean.com

1、Composite 组合模式

组合模式 一般用来描述 整体部分 的关系,它将对象组织到树形结构中,

所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局

最顶层的节点称为 根节点,根节点下面可以包含 树枝节点叶子节点,树枝节点下面又可以包含 树枝节点叶子节点。如下图所示:

1565775856439

1.1、示例代码

一个公司中从上到下有分级,那其实就是一个树形结构

1.1.1、员工表

package com.hlj.moudle.design.D05_一致性;

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


public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;


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

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

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

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    @Override
    public String toString() {
        return ("Employee :[ Name : " + name
                + ", dept : " + dept + ", salary :"
                + salary + " ]");
    }
}

1.1.2、测试 容器和内容

package com.hlj.moudle.design.D05_一致性;

/**
 * @author HealerJean
 * @ClassName Main
 * @date 2019/8/14  17:50.
 * @Description
 */
public class Main {

    public static void main(String[] args) {


        Employee CEO = new Employee("John", "CEO", 30000);
        Employee headSales = new Employee("Robert", "Head Sales", 20000);
        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);

        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        CEO.add(headSales);
        CEO.add(headMarketing);


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