介紹
這篇主要講述設(shè)計模式中的組合模式貌矿。組合模式又叫部分整體模式雷蹂,是用于把一組相似的對象當(dāng)作一個單一的對象姆怪。組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次宫屠。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式列疗,它創(chuàng)建了對象組的樹形結(jié)構(gòu)。
樹形結(jié)構(gòu)在軟件中隨處可見浪蹂,例如操作系統(tǒng)中的目錄結(jié)構(gòu)抵栈、應(yīng)用軟件中的菜單告材、辦公系統(tǒng)中的公司組織結(jié)構(gòu)等等。
接下來看看組合模式的結(jié)構(gòu)圖
結(jié)構(gòu)圖
在組合模式結(jié)構(gòu)圖中包含如下幾個角色:
- Component(抽象構(gòu)件):它可以是接口或抽象類竭讳,為葉子構(gòu)件和容器構(gòu)件對象聲明接口创葡,在該角色中可以包含所有子類共有行為的聲明和實(shí)現(xiàn)。在抽象構(gòu)件中定義了訪問及管理它的子構(gòu)件的方法绢慢,如增加子構(gòu)件灿渴、刪除子構(gòu)件、獲取子構(gòu)件等胰舆。
- Leaf(葉子構(gòu)件):它在組合結(jié)構(gòu)中表示葉子節(jié)點(diǎn)對象骚露,葉子節(jié)點(diǎn)沒有子節(jié)點(diǎn),它實(shí)現(xiàn)了在抽象構(gòu)件中定義的行為缚窿。對于那些訪問及管理子構(gòu)件的方法棘幸,可以通過異常等方式進(jìn)行處理。
- Composite(容器構(gòu)件):它在組合結(jié)構(gòu)中表示容器節(jié)點(diǎn)對象倦零,容器節(jié)點(diǎn)包含子節(jié)點(diǎn)误续,其子節(jié)點(diǎn)可以是葉子節(jié)點(diǎn),也可以是容器節(jié)點(diǎn)扫茅,它提供一個集合用于存儲子節(jié)點(diǎn)蹋嵌,實(shí)現(xiàn)了在抽象構(gòu)件中定義的行為,包括那些訪問及管理子構(gòu)件的方法葫隙,在其業(yè)務(wù)方法中可以遞歸調(diào)用其子節(jié)點(diǎn)的業(yè)務(wù)方法栽烂。
案例
Component (抽象構(gòu)件)
public abstract class Component {
public abstract void add(Component component);
public abstract void remove(Component component);
}
Leaf (葉子構(gòu)件)
public class Leaf extends Component {
@Override
public void add(Component component) {
// TODO Auto-generated method stub
}
@Override
public void remove(Component component) {
// TODO Auto-generated method stub
}
}
Composite (容器構(gòu)件)
public class Composite extends Component {
private List<Component> children = new ArrayList<Component>();
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
}
總結(jié)
組合模式的關(guān)鍵是定義了一個抽象構(gòu)件類,它既可以代表葉子恋脚,又可以代表容器腺办,而客戶端針對該抽象構(gòu)件類進(jìn)行編程,無須知道它到底表示的是葉子還是容器糟描,可以對其進(jìn)行統(tǒng)一處理怀喉。同時容器對象與抽象構(gòu)件類之間還建立一個聚合關(guān)聯(lián)關(guān)系,在容器對象中既可以包含葉子船响,也可以包含容器磺送,以此實(shí)現(xiàn)遞歸組合,形成一個樹形結(jié)構(gòu)灿意。
如果不使用組合模式,客戶端代碼將過多地依賴于容器對象復(fù)雜的內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)崇呵,容器對象內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)的變化將引起客戶代碼的頻繁變化缤剧,帶來了代碼維護(hù)復(fù)雜、可擴(kuò)展性差等弊端域慷。組合模式的引入將在一定程度上解決這些問題荒辕。