• 这种模式适用于优化对带有递归特性数据结构的操作。例如链表、树这种数据结构,常见的有文件树、权限树等。
    • 它强调,既然在创建这种数据结构时,它就自带有递归的特性,那么对它操作的时候,也应该在保证效率的前提下,使用递归来简化屎一样的多个for循环。
    • 对于一棵树高为2的权限树,如果直接使用for循环,那么需要两层,如果树高为100呢?那废了。
    1. public static void main(String[] args) {
    2. Department leafDept1 = new Department("叶子部门1");
    3. Department leafDept2 = new Department("叶子部门2");
    4. Department leafDept3 = new Department("叶子部门3");
    5. Department subDept1 = new Department("子部门1");
    6. subDept1.getChildren().add(leafDept1);
    7. subDept1.getChildren().add(leafDept2);
    8. Department subDept2 = new Department("子部门2");
    9. subDept2.getChildren().add(leafDept3);
    10. Department parentDept = new Department("父部门");
    11. parentDept.getChildren().add(subDept1);
    12. parentDept.getChildren().add(subDept2);
    13. for(Department subDept : parentDept.getChildren()) {
    14. if(subDept.getChildren().size() > 0) {
    15. for(Department leafDept : subDept.getChildren()) {
    16. leafDept.remove();
    17. }
    18. }
    19. subDept.remove();
    20. }
    21. parentDept.remove();
    22. // 问题:对层级数据的操作,很恶心,很不方便,需要手工编写大量的屎一样的代码
    23. // 平时,屎一样代码的典型特征,四五个,六七个,for if else,嵌套,嵌套的非常深,1年后,团队里没人看得懂你写的代码
    24. }
    25. @Data
    26. public static class Department {
    27. private String name;
    28. private List<Department> children = new ArrayList<Department>();
    29. public Department(String name) {
    30. super();
    31. this.name = name;
    32. }
    33. public void remove() {
    34. System.out.println("删除部门【" + name + "】");
    35. }
    36. }
    • 使用组合模式优化后,将删除部门的功能使用递归实现。
    1. public static void main(String[] args) {
    2. Department leafDept1 = new Department("叶子部门1");
    3. Department leafDept2 = new Department("叶子部门2");
    4. Department leafDept3 = new Department("叶子部门3");
    5. Department subDept1 = new Department("子部门1");
    6. subDept1.getChildren().add(leafDept1);
    7. subDept1.getChildren().add(leafDept2);
    8. Department subDept2 = new Department("子部门2");
    9. subDept2.getChildren().add(leafDept3);
    10. Department parentDept = new Department("父部门");
    11. parentDept.getChildren().add(subDept1);
    12. parentDept.getChildren().add(subDept2);
    13. parentDept.remove();
    14. }
    15. @Data
    16. public static class Department {
    17. private String name;
    18. private List<Department> children = new ArrayList<Department>();
    19. public Department(String name) {
    20. super();
    21. this.name = name;
    22. }
    23. //这是重点
    24. public void remove() {
    25. if(children.size() > 0) {
    26. for(Department child : children) {
    27. child.remove();
    28. }
    29. }
    30. System.out.println("删除部门【" + name + "】");
    31. }
    32. }