一、介紹
開發(fā)中經(jīng)常會遇到這樣一個需求,列表數(shù)據(jù)做多級顯示,對于整體——部分這類場景可以用組合模式來解決,提取出公共信息成立一個基類,多級結構分級成立不同的類,分別都繼承基類,實現(xiàn)基類中定義的方法,同時在各級子類中聚合基類,形成根節(jié)點中包含下一級根節(jié)點和葉子節(jié)點這種樹狀結構。
二、UML類圖

組合模式
這個例子中是需要展示學校下屬學院,學院下屬的系,多級分層全部顯示,這里提取出學校、學院、系的公共信息,包含了名字、添加和刪除操作,將這些公共信息成立一個基類Organization,同時定義一個print方法,需要各級機構去實現(xiàn),各級機構繼承基類的同時,還要聚合基類,這樣使得各級子結構可以添加、刪除自己的根節(jié)點和葉子節(jié)點,實現(xiàn)多級樹狀結構。
三、代碼示例
public abstract class Organization {
private String mName;
public Organization(String name) {
this.mName = name;
}
public String getName() {
return mName;
}
public void setName(String name){
mName = name;
}
protected void addOrganization(Organization organization){}
protected void removeOrganization(Organization organization){}
protected abstract void print();
}
public class University extends Organization{
private final List<Organization> mOrganizations = new ArrayList<>();
public University(String name) {
super(name);
}
@Override
protected void addOrganization(Organization organization) {
super.addOrganization(organization);
mOrganizations.add(organization);
}
@Override
protected void removeOrganization(Organization organization) {
super.removeOrganization(organization);
mOrganizations.remove(organization);
}
@Override
protected void print() {
System.out.println("***********"+getName()+"***********");
for (Organization organization : mOrganizations) {
organization.print();
}
}
}
public class College extends Organization{
private final List<Organization> mOrganizations = new ArrayList<>();
public College(String name) {
super(name);
}
@Override
protected void addOrganization(Organization organization) {
super.addOrganization(organization);
mOrganizations.add(organization);
}
@Override
protected void removeOrganization(Organization organization) {
super.removeOrganization(organization);
mOrganizations.remove(organization);
}
@Override
protected void print() {
System.out.println(" *********"+getName()+"********* ");
for (Organization organization : mOrganizations) {
organization.print();
}
}
}
public class Department extends Organization{
public Department(String name) {
super(name);
}
@Override
protected void print() {
System.out.println(" *******"+getName()+"******* ");
}
}
組合模式關鍵在于提取公共信息成立一個基類,讓各級子類都去繼承這個基類,同時定義一個抽象方法,各級子類根據(jù)各自的業(yè)務去實現(xiàn)這個抽象方法,從而形成各級結構的差異化,子類聚合基類的處理方式使得系統(tǒng)實現(xiàn)層級結構。
四、總結
對于對數(shù)據(jù)需要進行整體——部分分層處理的這種場景,組合模式尤為合適,這種模式上層結構不需要關心下層處理的是單層對象還是組合對象,下層結果自行根據(jù)自己是根節(jié)點還是葉子節(jié)點去遞歸處理。在Java中HashMap這種常用的數(shù)據(jù)結構就是根據(jù)組合模式實現(xiàn)的。