淺談JAVA設計模式之——組合模式(Composite)
阿新 • • 發佈:2019-01-28
一、概述
將物件組合成樹形結構以表示"部分-整體"的層次結構。"Composite使得使用者對單個物件和組合物件的使用具有一致性。
二、適用性
1.你想表示物件的部分-整體層次結構。
2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
三、參與者
1.Component 為組合中的物件宣告介面。 在適當的情況下,實現所有類共有介面的預設行為。 宣告一個介面用於訪問和管理Component的子元件。 (可選)在遞迴結構中定義一個介面,用於訪問一個父部件,並在合適的情況下實現它。
2.Leaf 在組合中表示葉節點物件,葉節點沒有子節點。 在組合中定義節點物件的行為。
3.Composite 定義有子部件的那些部件的行為。 儲存子部件。 在Component介面中實現與子部件有關的操作。
4.Client 通過Component介面操縱組合部件的物件。
四、類圖
五、示例
Component- package com.lyz.design.composite;
- import java.util.List;
- /**
- * 定義Component 類Employer
- * @author liuyazhuang
- *
- */
- publicabstractclass Employer {
-
private String name;
- publicvoid setName(String name) {
- this.name = name;
- }
- public String getName() {
- returnthis.name;
- }
- publicabstractvoid add(Employer employer);
- publicabstractvoid delete(Employer employer);
- public List<Employer> employers;
-
public
- System.out.println(name);
- }
- public List<Employer> getEmployers() {
- returnthis.employers;
- }
- }
Leaf
- package com.lyz.design.composite;
- /**
- * 定義Leaf類Programmer
- * @author liuyazhuang
- *
- */
- publicclass Programmer extends Employer {
- public Programmer(String name) {
- setName(name);
- employers = null;//程式設計師, 表示沒有下屬了
- }
- publicvoid add(Employer employer) {
- }
- publicvoid delete(Employer employer) {
- }
- }
- package com.lyz.design.composite;
- /**
- * 定義Leaf類ProjectAssistant
- * @author liuyazhuang
- *
- */
- publicclass ProjectAssistant extends Employer {
- public ProjectAssistant(String name) {
- setName(name);
- employers = null;//專案助理, 表示沒有下屬了
- }
- publicvoid add(Employer employer) {
- }
- publicvoid delete(Employer employer) {
- }
- }
Composite
- package com.lyz.design.composite;
- import java.util.ArrayList;
- /**
- * 定義Composite類ProjectManager類
- * @author liuyazhuang
- *
- */
- publicclass ProjectManager extends Employer {
- public ProjectManager(String name) {
- setName(name);
- employers = new ArrayList<Employer>();
- }
- publicvoid add(Employer employer) {
- employers.add(employer);
- }
- publicvoid delete(Employer employer) {
- employers.remove(employer);
- }
- }
Client
- package com.lyz.design.composite;
- import java.util.List;
- /**
- * 測試類
- * @author liuyazhuang
- *
- */
- publicclass Test {
- publicstaticvoid main(String[] args) {
- Employer pm = new ProjectManager("專案經理");
- Employer pa = new ProjectAssistant("專案助理");
- Employer programmer1 = new Programmer("程式設計師一");
- Employer programmer2 = new Programmer("程式設計師二");
- pm.add(pa);//為專案經理新增專案助理
- pm.add(programmer2);//為專案經理新增程式設計師
- List<Employer> ems = pm.getEmployers();
- for (Employer em : ems) {
- System.out.println(em.getName());
- }
- }
- }
result
- 專案助理
- 程式設計師二