Github: CompositePattern.java
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

  1. 定义员工类

    1. /**
    2. * 定义员工
    3. */
    4. public class Employee{
    5. private String name;
    6. private String dept;
    7. private int salary;
    8. private List<Employee> subordinates;
    9. public Employee(String name, String dept, int salary) {
    10. this.name = name;
    11. this.dept = dept;
    12. this.salary = salary;
    13. this.subordinates = new ArrayList<>();
    14. }
    15. public Employee add(Employee e){
    16. subordinates.add(e);
    17. return this;
    18. }
    19. public Employee remove(Employee e){
    20. subordinates.remove(e);
    21. return this;
    22. }
    23. public List<Employee> getSubordinates() {
    24. return subordinates;
    25. }
    26. @Override
    27. public String toString() {
    28. return "Employee{" + "name='" + name + '\'' + ", dept='" + dept + '\'' + ", salary=" + salary + '}';
    29. }
    30. }
  2. 测试,打印 ```java public static void main(String[] args) { CompositePattern pattern = new CompositePattern(); pattern.composite(); }

private void composite() { Employee ceo = new Employee(“gao”, “ceo”, 2000); Employee cfo = new Employee(“sky1”, “cfo”, 2000); Employee cto = new Employee(“sky”, “cto”, 2000); ceo.add(cfo).add(cto);

  1. Employee cfo_e1 = new Employee("cf_e1", "cfo", 10);
  2. Employee cfo_e2 = new Employee("cf_e2", "cfo", 10);
  3. cfo.add(cfo_e1).add(cfo_e2);
  4. Employee cto_e1 = new Employee("ct_e1", "cto", 9);
  5. Employee cto_e2 = new Employee("ct_e2", "cto", 9);
  6. cto.add(cto_e1).add(cto_e2);
  7. Stack<Employee> stack = new Stack<>();
  8. stack.add(ceo);
  9. while (stack != null && stack.size() > 0){
  10. Employee e = stack.pop();
  11. System.out.println(e);
  12. List<Employee> es;
  13. if((es = e.getSubordinates()) != null && es.size() > 0){
  14. stack.addAll(es);
  15. }
  16. }

}

  1. 输出结果:
  2. ```java
  3. Employee{name='gao', dept='ceo', salary=2000}
  4. Employee{name='sky', dept='cto', salary=2000}
  5. Employee{name='ct_e2', dept='cto', salary=9}
  6. Employee{name='ct_e1', dept='cto', salary=9}
  7. Employee{name='sky1', dept='cfo', salary=2000}
  8. Employee{name='cf_e2', dept='cfo', salary=10}
  9. Employee{name='cf_e1', dept='cfo', salary=10}

这里可以优化打印逻辑,使得输出结果呈现树形结构。更能直观

参考

菜鸟教程 - 组合模式