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