定义:

  • 用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。

    特点:

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码。(优点)

  • 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。(优点)
  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系。(缺点)
  • 不容易用继承的方法来增加构件的新功能。(缺点)

    通常适用场景:

  • 在需要表示一个对象整体与部分的层次结构的场合。

  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

    demo代码:

  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 sal) {
  10. this.name = name;
  11. this.dept = dept;
  12. this.salary = sal;
  13. subordinates = new ArrayList<>();
  14. }
  15. public void add(Employee e) {
  16. subordinates.add(e);
  17. }
  18. public void remove(Employee e) {
  19. subordinates.remove(e);
  20. }
  21. public List<Employee> getSubordinates(){
  22. return subordinates;
  23. }
  24. }