1. 程式人生 > >(@WhiteTaken)設計模式學習——組合模式

(@WhiteTaken)設計模式學習——組合模式

合成 concrete cnblogs java mil 使用 for -- 總公司

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

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

理論:將對象組合成樹形結構以表示“部分-整體”的層次結構。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 }

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

測試結果。

技術分享

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

(@WhiteTaken)設計模式學習——組合模式