composite 模式

    场景:

    • 父部门->子部门->子部门
    • 我们要对部门树,删除一个父部门以及其下所有的子部门

    组合模式非常适用于有较多父子层级关系的那种场景,比如部门树的递归删除,或者是文件树的递归删除之类的场景。

    1. package com.example.designpattern.composite;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class CompositePatternDemo {
    5. public static void main(String[] args) {
    6. Department leafDept1 = new Department("叶子部门1");
    7. Department leafDept2 = new Department("叶子部门2");
    8. Department leafDept3 = new Department("叶子部门3");
    9. Department subDept1 = new Department("子部门1");
    10. subDept1.getChildren().add(leafDept1);
    11. subDept1.getChildren().add(leafDept2);
    12. Department subDept2 = new Department("子部门2");
    13. subDept2.getChildren().add(leafDept3);
    14. Department parentDept = new Department("父部门");
    15. parentDept.getChildren().add(subDept1);
    16. parentDept.getChildren().add(subDept2);
    17. parentDept.remove();
    18. // 组合模式的第一要义,就是将树形结构的数据,用一个类,或者少数一两个类,就可以拼装成一棵树的形状
    19. // 组合模式的第二要义,就是直接对一个父级的数据执行某个操作,这个操作会直接递归调用所有下层的子数据的相关操作
    20. // 通过这个树形结构自己递归自己的方式,就将对一棵树的操作,完美的执行了
    21. // 好处,就是对树形数据的操作,不需要调用方组织复杂的屎一样的if for的代码,去执行
    22. // 外部要操作一颗树,直接对树的父级节点,调用一个操作,这颗树自己就递归着把事儿给干完了
    23. }
    24. public static class Department {
    25. private String name;
    26. private List<Department> children = new ArrayList<Department>();
    27. public Department(String name) {
    28. super();
    29. this.name = name;
    30. }
    31. public String getName() {
    32. return name;
    33. }
    34. public void setName(String name) {
    35. this.name = name;
    36. }
    37. public List<Department> getChildren() {
    38. return children;
    39. }
    40. public void setChildren(List<Department> children) {
    41. this.children = children;
    42. }
    43. public void remove() {
    44. if(children.size() > 0) {
    45. for(Department child : children) {
    46. child.remove();
    47. }
    48. }
    49. System.out.println("删除部门【" + name + "】");
    50. }
    51. }
    52. }