设计模式系列——组合模式

123 阅读1分钟

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

组合模式经常用于树形组织结构,比如人事组织关系。CEO下面有经理,经理下面有总监,总监下面有组长,组长下面有组员。而对这些对象的操作都是一样的,比如添加,删除,查询下级组织等等。简单来说就是对于整体的所有对象的操作方式和单一个体的操作方式是一致的。

举个例子

通过组合模式实现一个公司的组织结构遍历。

先来看一下UML图:

composite.png

再来看一下代码具体实现

//基本员工类,包含姓名,部门,薪水等属性
//有增加员工删除员工等操作
public class Employee {

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

    public Employee(String name, String dept, int salary) {
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        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+" ]");
    }
}

客户端这样使用Employee类实现公司组织结构

public class CompositePatternDemo {

    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("Rob","Sales", 10000);

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

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

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

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

        //print all employees of the organization
        System.out.println(CEO);
    }

}

总结

组合模式是结构模式之一,可以灵活的实现部分和整体的层级关系,前提是部分和整体的操作方式都是一致的。就像例子中体现的那样。

本文参考 www.tutorialspoint.com/design_patt…