结构型设计模式(三)组合模式

一、一句话背景

假如我要统计部门员工的情况,而员工有层级结构之分,那么可以把这整个部门的员工统一依据树形结构来组合成雇员对象。

二、使用场景

组合模式:就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是

       非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节

     点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。

       即:组合模式依据树形结构来组合对象,用来表示部分以及整体层次,使得一组相似的对象当作一个单一的对象。

如:1.需要展示树型结构时。

  2.想表示对象的部分-整体层次结构(树形结构)时。

三、模型分析

员工类:组合模型类,内部存在一个List方法用于存放下级树。

四、代码分析

员工类

/**
 * 员工类
 */
public class Employee {
    private String name;
    private String dept;
    private int salary;
    //定义了一个list用于存放下级节点(下级节点中也存放的也是同类对象)
    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;
    }

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

模拟打印部门员工信息

/**
 * 模拟打印部门员工信息
 * PS:虽然存在职位高低,但是都是员工,所以都用同一个类对象
 */
public class CompositePatternDemo {
    public static void main(String[] args) {
        //大boss
        Employee CEO = new Employee("John", "CEO", 30000);

        //2级boss(销售头头)
        Employee headSales = new Employee("Robert", "Head Sales", 20000);
        //2级boss(市场头头)
        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        //3级雇员(销售经理)
        Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);
        //3级雇员(业务员)
        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        //大boss的直属下属(销售头头、市场头头)
        CEO.add(headSales);
        CEO.add(headMarketing);

        //销售头头的直属下属(销售经理)
        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        //市场头头的直属下属(业务员)
        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        //打印该组织的所有员工
        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/riches/p/11252630.html