文章出處

下面來學習一下組合模式。

組合模式概念是什么呢。從別的地方抄來了一些理論。

理論:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite模式使得用戶對單個對象和組合對象的使用具有一致性。

 

拙見:組合模式就是為處理樹形結構優化出來的一套理論方法。-_-!!!用遞歸可以統一處理樹形結構中的對象。

下面直接上代碼。

總公司  --分公司

          --分公司下屬分公司

          --分公司下屬辦事處

       --分公司辦事處

接口類ICompany。

1 import java.util.List;
2 
3 public interface ICompany {
4     public void display();
5     public boolean add(ICompany company);
6     public boolean remove(ICompany company);
7     public List<ICompany> getChild();
8 }

 公司類Company。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Company implements ICompany {
 5     private String name;
 6     private List<ICompany> children;
 7     
 8     public Company(String name) {
 9         this.name = name;
10         this.children = new ArrayList<ICompany>();
11     }
12     @Override
13     public void display() {
14         System.out.println(name);
15     }
16     @Override
17     public boolean add(ICompany company) {
18         return children.add(company);
19     }
20     @Override
21     public boolean remove(ICompany company) {
22         return children.remove(company);
23     }
24     @Override
25     public List<ICompany> getChild() {
26         return children;
27     }
28 }

辦事處類ConcreteCompany。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class ConcreteCompany implements ICompany {
 5     private String name;
 6     
 7     public ConcreteCompany(String name) {
 8         this.name = name;
 9     }
10     @Override
11     public void display() {
12         System.out.println(name);
13     }
14     @Override
15     public boolean add(ICompany company) {
16         return false;
17     }
18     @Override
19     public boolean remove(ICompany company) {
20         return false;
21     }
22     @Override
23     public List<ICompany> getChild() {
24         return null;
25     }
26 }

測試類MainClass。

 1 import java.util.List;
 2 
 3 /*
 4  * 組合模式測試
 5  */
 6 public class MainClass {
 7     public static void main(String[] args) {
 8         ICompany company = new Company("總公司");
 9         ICompany company1 = new Company("分公司1");
10         ICompany company2 = new Company("分公司2");
11         ICompany company3 = new ConcreteCompany("分公司辦事處");
12         company.add(company1);
13         company.add(company2);
14         company.add(company3);
15         
16         ICompany company11 = new Company("分公司1下屬公司1");
17         ICompany company12 = new Company("分公司1下屬公司2");
18         ICompany company13 = new ConcreteCompany("分公司1下屬辦事處");
19         company1.add(company11);
20         company1.add(company12);
21         company1.add(company13);
22         
23         ICompany company21 = new Company("分公司2下屬公司");
24         ICompany company22 = new ConcreteCompany("分公司2下屬辦事處");
25         company2.add(company21);
26         company2.add(company22);
27         
28         displayAllCompany(company, 0);
29     }
30 
31     private static void displayAllCompany(ICompany rootCompany, int deep) {
32         for(int i = 0; i < deep; i++)
33         {
34             System.out.print("-");
35         }
36         rootCompany.display();
37         List<ICompany> children = rootCompany.getChild();
38         for(ICompany company:children)
39         {
40             if(company instanceof ConcreteCompany)
41             {
42                 for(int i = 0; i <= deep; i++)
43                 {
44                     System.out.print("-");
45                 }
46                 company.display();
47             }
48             else
49             {
50                 displayAllCompany(company, deep + 1);
51             }
52         }
53         
54     }
55 }

以上代碼主要就是用遞歸方法遍歷了公司的結構。

測試結果。

這個模式的精華都在代碼里,大家自己體會吧。。。共同進步!!!

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()