組合模式主要是展現部分與整體層次的結構,統一使用結構中的所有對象(書中原話)。
個人了解:組合模式多用于樹狀展現的内容中。
本示例省略書中的履行職責方法,這個對該模式沒什麼影響
UML圖

代碼結構
public class Client {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京總公司");
root.add(new HRDepartment("總公司人力資源部"));
root.add(new FinanceDepartment("總公司财務部"));
ConcreteCompany comp = new ConcreteCompany("上海華東分公司");
comp.add(new HRDepartment("東分公司人力資源部"));
comp.add(new FinanceDepartment("東分公司财務部"));
root.add(comp);
ConcreteCompany comp1 = new ConcreteCompany("南京辦事處");
comp1.add(new HRDepartment("南京辦事處人力資源部"));
comp1.add(new FinanceDepartment("南京辦事處财務部"));
comp.add(comp1);
ConcreteCompany comp2 = new ConcreteCompany("杭州辦事處");
comp2.add(new HRDepartment("杭州辦事處人力資源部"));
comp2.add(new FinanceDepartment("杭州辦事處财務部"));
comp.add(comp2);
System.out.println("結構圖");
root.display();
}
}
public abstract class Company {
private String name; //書中是procteced,為了和以往程式設計習慣一緻,這裡使用private
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company() { //保留無參構造方法
super();
}
public Company(String name) {
super();
this.name = name;
}
public abstract void add(Company company);
public abstract void remove(Company company);
public abstract void display(int depth);
}
public class ConcreteCompany extends Company {
private List<Company> children = new ArrayList<>();
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company company) {
children.add(company);
}
@Override
public void remove(Company company) {
children.remove(company);
}
@Override
public void display(int depth) {
for(int i = ; i < depth; i++) { //由于沒有找到書中的類似方法,這裡作了一個小循環
System.out.print("-");
}
System.out.println(getName());
for(Company component : children) {
component.display(depth + );
}
}
}
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
for(int i = ; i < depth; i++) { //由于沒有找到書中的類似方法,這裡作了一個小循環
System.out.print("-");
}
System.out.println(getName());
}
}
public class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
for(int i = ; i < depth; i++) { //由于沒有找到書中的類似方法,這裡作了一個小循環
System.out.print("-");
}
System.out.println(getName());
}
}
結果
多說一句,從上面可以看到HRDepartment和FinanceDepartment的display方法都是重複的代碼,這個可以用模版方法模式進行優化,在父類定義一個方法template,然後子類調用,ConcreCompany調用父類後再添加自己的邏輯即可。