組合模式(Composite),將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
使用時機:需求中是體現部分與整體層次的結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮用組合模式了。
組合模式基本對象可以被組合成更復雜的組合對象,而這個組合對象又可以被組合,這樣不斷地遞歸下去,客戶代碼中,任何用到基本對象的地方都可以使用組合對象了。
類圖:
根據類圖結合公司的例子,將實例代碼放出:
//package com.dlut.designpattern.composite;
import java.util.ArrayList;
import java.util.List;
public abstract class Company {
public String name;
public Company(){
}
public Company(String name){
this.name=name;
}
public abstract void add(Company c);
public abstract void remove(Company c);
public abstract void eachChild();
public String toString() {
return "Company [name=" + name + "]";
}
}
class ConcreteCompany extends Company{
List<Company> lists=new ArrayList<Company>();
public ConcreteCompany(){}
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company c) {
lists.add(c);
}
@Override
public void remove(Company c) {
lists.remove(c);
}
@Override
/**
* 注意此處的用法,看不懂的童鞋請仔細分析
*/
public void eachChild() {
System.out.println(this);
for(Company c:lists){
c.eachChild();
}
}
}
class LeafCompany extends Company{
public LeafCompany(){}
public LeafCompany(String name){
super(name);
}
@Override
public void add(Company c) {
}
@Override
public void remove(Company c) {
}
@Override
public void eachChild() {
System.out.println(this);
}
}
測試類:
//package com.dlut.designpattern.composite;
public class Test {
public static void main(String[] args) {
Company root=new ConcreteCompany("總公司");
root.add(new LeafCompany("大連辦事處"));
Company bj=new ConcreteCompany("北京分公司");
bj.add(new LeafCompany("朝陽辦事處"));
root.add(bj);
root.eachChild();
}
}
先別看答案,仔細想想執行結果。
Company [name=總公司]
Company [name=大連辦事處]
Company [name=北京分公司]
Company [name=朝陽辦事處]
想想是哪句起了關鍵作用?是不是for(Company c:lists){c.eachChild();}
這句 ?
參考: