二十三種設計模式之結構型模式之組合模式

組合模式

概述


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

適用性


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

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

參與者


1.Component
  爲組合中的對象聲明接口。
  在適當的情況下,實現所有類共有接口的缺省行爲。
  聲明一個接口用於訪問和管理Component的子組件。
  (可選)在遞歸結構中定義一個接口,用於訪問一個父部件,並在合適的情況下實現它。

2.Leaf
  在組合中表示葉節點對象,葉節點沒有子節點。
  在組合中定義節點對象的行爲。

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

4.Client
  通過Component接口操縱組合部件的對象。

類圖


這裏寫圖片描述
例子


Component

public abstract class Employer {

    private String name;

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

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

    public abstract void add(Employer employer);

    public abstract void delete(Employer employer);

    public List employers;

    public void printInfo() {
        System.out.println(name);
    }

    public List getEmployers() {
        return this.employers;
    }
}

Leaf

public class Programmer extends Employer {

    public Programmer(String name) {
        setName(name);
        employers = null;//程序員, 表示沒有下屬了
    }

    public void add(Employer employer) {

    }

    public void delete(Employer employer) {

    }
}
public class ProjectAssistant extends Employer {

    public ProjectAssistant(String name) {
        setName(name);
        employers = null;//項目助理, 表示沒有下屬了
    }

    public void add(Employer employer) {

    }

    public void delete(Employer employer) {

    }
}

Composite

public class ProjectManager extends Employer {

    public ProjectManager(String name) {
        setName(name);
        employers = new ArrayList();
    }

    public void add(Employer employer) {
        employers.add(employer);
    }

    public void delete(Employer employer) {
        employers.remove(employer);
    }
}

Client

public class Test {

    public static void 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 ems = pm.getEmployers();
        for (Employer em : ems) {
            System.out.println(em.getName());
        }
    }
}

result

項目助理
程序員二

Copyright © 2008 Angus Young
瘋狂Java聯盟:http://www.crazyit.org

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章