設計模式之組合模式(15):對層級數據遞歸調用執行操做

場景

場景:
(1)父部門->子部門->子部門
(2)咱們要對部門樹,刪除一個父部門以及其下全部的子部門設計模式

內容

1.不使用設計模式

部門樹形結構,咱們能夠用一個對象來表示,裏面報表集合屬性。this

1.1 類圖

image.png

  1. 組裝部門樹時候,只須要一級一級的組裝
  2. 刪除時候根據遍歷刪除

1.2 代碼

public class NonPattern2 {
    public static void main(String[] args) {
        //1.根節點
        Department rootDepartment = new Department("根部門");

        //2.子節點
        Department subDepartment1 = new Department("子部門1");
        Department subDepartment2 = new Department("子部門2");

        //3.孫子節點
        Department leafDepartment1 = new Department("葉子部門1");
        Department leafDepartment2 = new Department("葉子部門2");
        Department leafDepartment3 = new Department("葉子部門3");

        //4.組裝數據
         rootDepartment.getChidlren().add(subDepartment1);
         rootDepartment.getChidlren().add(subDepartment2);

         subDepartment1.getChidlren().add(leafDepartment1);
         subDepartment1.getChidlren().add(leafDepartment2);
         subDepartment2.getChidlren().add(leafDepartment3);


         //5.刪除數據
         for (Department subDept:rootDepartment.getChidlren()){
             if(subDept.getChidlren().size()>0){
                 for (Department leafDept:subDept.getChidlren()){
                     leafDept.remove();
                 }
             }
             subDept.remove();
         }
         rootDepartment.remove();

        /**
         * 輸出:
         * 刪除部門【葉子部門1】
         * 刪除部門【葉子部門2】
         * 刪除部門【子部門1】
         * 刪除部門【葉子部門3】
         * 刪除部門【子部門2】
         * 刪除部門【根部門】
         */
    }

    public static class Department{
        private String name;
        private List<Department> chidlren = new ArrayList();

        public Department(String name){
            this.name = name;
        }
        public void remove(){
                System.out.println("刪除部門【" + name + "】");
        }
        public void setChidlren(List<Department> chidlren) {
            this.chidlren = chidlren;
        }

        public List<Department> getChidlren() {
            return chidlren;
        }

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

2.使用組合模式

2.1 類圖

image.png

  1. 組合設計模式和不使用設計模式的類圖相似,最主要區別是remove方法執行邏輯。
  2. remove方法實現遞歸刪除。

2.2 代碼

public class CompositePattern2 {

    public static void main(String[] args) {
        //1.父部門
        Department parentDept = new Department("父部門");

        //2.子部門
        Department subDept1 = new Department("子部門1");
        Department subDept2 = new Department("子部門2");

        //3.葉子部門
        Department leafDept1 = new Department("葉子部門1");
        Department leafDept2 = new Department("葉子部門2");
        Department leafDept3 = new Department("葉子部門3");

        //4.組裝數據
        subDept1.getChildren().add(leafDept1);
        subDept1.getChildren().add(leafDept2);
        subDept2.getChildren().add(leafDept3);

        parentDept.getChildren().add(subDept1);
        parentDept.getChildren().add(subDept2);

        //5.刪除
        parentDept.remove();
    }


    public static class Department{
        private String name;
        private List<Department> children = new ArrayList<Department>();

        public Department(String name){
            super();
            this.name = name;
        }
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<Department> getChildren() {
            return children;
        }

        public void setChildren(List<Department> children) {
            this.children = children;
        }

        //===================關鍵點=================
        public void remove(){
            //遞歸刪除:遞歸找準結束邊界:對象的屬性集合不大於0就結束
            if(children.size()>0){
              for (Department child:children){
                  child.remove();//遞歸調用
              }
            }
            System.out.println("刪除部門【" + name + "】");
        }
    }
}

3.總結

3.1 不使用設計模式

  1. 調用方須要知道被調用方邏輯,而且須要使用大量if---for,若是被調用方更改了裏面邏輯代碼,那麼調用方也得更改裏面代碼。

3.2 使用設計模式

  1. 組合模式的第一要義,就是將樹形結構的數據,用一個類,或者少數一兩個類,就能夠拼裝成一棵樹的形狀。
  2. 組合模式的第二要義,就是直接對一個父級的數據執行某個操做,這個操做會直接遞歸調用全部下層的子數據的相關操做;經過這個樹形結構本身遞歸本身的方式,就將對一棵樹的操做,完美的執行了
  3. 好處,就是對樹形數據的操做,不須要調用方組織複雜的屎同樣的if for的代碼,去執行。
  4. 外部要操做一顆樹,直接對樹的父級節點,調用一個操做,這顆樹本身就遞歸着把事兒給幹完了。
  5. 設計模式,重點,是思想,理解了思想,隨便招式你怎麼出,只要能將思想運用到實際業務場景中;避免寫出垃圾代碼,你就成功了;若是你照搬設計模式去寫,反而增長代碼的複雜度。
相關文章
相關標籤/搜索