1. 程式人生 > >淺談JAVA設計模式之——組合模式(Composite)

淺談JAVA設計模式之——組合模式(Composite)

一、概述

將物件組合成樹形結構以表示"部分-整體"的層次結構。"Composite使得使用者對單個物件和組合物件的使用具有一致性。

二、適用性

1.你想表示物件的部分-整體層次結構。

2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

三、參與者

1.Component 為組合中的物件宣告介面。 在適當的情況下,實現所有類共有介面的預設行為。 宣告一個介面用於訪問和管理Component的子元件。 (可選)在遞迴結構中定義一個介面,用於訪問一個父部件,並在合適的情況下實現它。

2.Leaf 在組合中表示葉節點物件,葉節點沒有子節點。 在組合中定義節點物件的行為。 

3.Composite 定義有子部件的那些部件的行為。 儲存子部件。 在Component介面中實現與子部件有關的操作。 

4.Client 通過Component介面操縱組合部件的物件。

四、類圖

五、示例

Component
  1. package com.lyz.design.composite;  
  2. import java.util.List;  
  3. /** 
  4.  * 定義Component 類Employer 
  5.  * @author liuyazhuang 
  6.  * 
  7.  */
  8. publicabstractclass Employer {  
  9.     private String name;  
  10.     publicvoid setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public String getName() {  
  14.         returnthis.name;  
  15.     }  
  16.     publicabstractvoid add(Employer employer);  
  17.     publicabstractvoid delete(Employer employer);  
  18.     public List<Employer> employers;  
  19.     public
    void printInfo() {  
  20.         System.out.println(name);  
  21.     }  
  22.     public List<Employer> getEmployers() {  
  23.         returnthis.employers;  
  24.     }  
  25. }  

Leaf
  1. package com.lyz.design.composite;  
  2. /** 
  3.  * 定義Leaf類Programmer 
  4.  * @author liuyazhuang 
  5.  * 
  6.  */
  7. publicclass Programmer extends Employer {  
  8.     public Programmer(String name) {  
  9.         setName(name);  
  10.         employers = null;//程式設計師, 表示沒有下屬了
  11.     }  
  12.     publicvoid add(Employer employer) {  
  13.     }  
  14.     publicvoid delete(Employer employer) {  
  15.     }  
  16. }  

  1. package com.lyz.design.composite;  
  2. /** 
  3.  * 定義Leaf類ProjectAssistant 
  4.  * @author liuyazhuang 
  5.  * 
  6.  */
  7. publicclass ProjectAssistant extends Employer {  
  8.     public ProjectAssistant(String name) {  
  9.         setName(name);  
  10.         employers = null;//專案助理, 表示沒有下屬了
  11.     }  
  12.     publicvoid add(Employer employer) {  
  13.     }  
  14.     publicvoid delete(Employer employer) {  
  15.     }  
  16. }  

Composite
  1. package com.lyz.design.composite;  
  2. import java.util.ArrayList;  
  3. /** 
  4.  * 定義Composite類ProjectManager類 
  5.  * @author liuyazhuang 
  6.  * 
  7.  */
  8. publicclass ProjectManager extends Employer {  
  9.     public ProjectManager(String name) {  
  10.         setName(name);  
  11.         employers = new ArrayList<Employer>();  
  12.     }  
  13.     publicvoid add(Employer employer) {  
  14.         employers.add(employer);  
  15.     }  
  16.     publicvoid delete(Employer employer) {  
  17.         employers.remove(employer);  
  18.     }  
  19. }  

Client
  1. package com.lyz.design.composite;  
  2. import java.util.List;  
  3. /** 
  4.  * 測試類 
  5.  * @author liuyazhuang 
  6.  * 
  7.  */
  8. publicclass Test {  
  9.     publicstaticvoid main(String[] args) {  
  10.         Employer pm = new ProjectManager("專案經理");  
  11.         Employer pa = new ProjectAssistant("專案助理");  
  12.         Employer programmer1 = new Programmer("程式設計師一");  
  13.         Employer programmer2 = new Programmer("程式設計師二");  
  14.         pm.add(pa);//為專案經理新增專案助理
  15.         pm.add(programmer2);//為專案經理新增程式設計師
  16.         List<Employer> ems = pm.getEmployers();  
  17.         for (Employer em : ems) {  
  18.             System.out.println(em.getName());  
  19.         }  
  20.     }  
  21. }  

result
  1. 專案助理  
  2. 程式設計師二