組合模式
概述
將對象組合成樹形結構以表示"部分-整體"的層次結構。"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