一、組合模式基本概念
1.1 定義與類型
組合模式是一種結構型設計模式,它通過將對象組織成樹形結構,來表示“部分-整體”的層次關系。這種模式使得客戶端可以一致地對待單個對象和組合對象,從而簡化了客戶端代碼的復雜性。組合模式的核心在于定義了一個抽象組件角色,這個角色既可以代表葉子節點,也可以代表容器節點,每個節點都可以包含子節點。
在組合模式中,對象被組織成一種樹形結構,這種結構允許對象以層次化的方式組合,形成一個整體。樹形結構的頂端是根節點,根節點下面可以有多個子節點,這些子節點可以是葉子節點,也可以是其他容器節點。這種結構允許我們以一致的方式來處理單個對象和組合對象,使得客戶端代碼更加簡潔和統一。
// 抽象組件角色
public interface Component {void operation();void add(Component component);void remove(Component component);Component getChild(int index);
}// 葉子節點角色
public class Leaf implements Component {@Overridepublic void operation() {// 具體操作}@Overridepublic void add(Component component) {// 葉子節點不能添加子節點throw new UnsupportedOperationException();}@Overridepublic void remove(Component component) {// 葉子節點不能移除子節點throw new UnsupportedOperationException();}@Overridepublic Component getChild(int index) {// 葉子節點沒有子節點throw new IndexOutOfBoundsException();}
}// 容器節點角色
public class Composite implements Component {private List<Component> children = new ArrayList<>();@Overridepublic void operation() {// 具體操作for (Component component : children) {component.operation();}}@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic Component getChild(int index) {return children.get(index);}
}
1.2 組合模式的目的
組合模式的主要目的是使得客戶端可以一致地對待單個對象和組合對象。通過這種方式,客戶端無需關心它處理的是單個對象還是一組對象,這大大簡化了客戶端的代碼復雜性。例如,在一個文件系統中,文件和文件夾可以被視為組合模式中的對象,客戶端可以以相同的方式操作文件和文件夾,而無需知道它們的具體類型。
此外,組合模式通過提供一個統一的接口,使得新增節點類型變得非常容易,而無需修改現有的代碼。這符合設計模式中的開閉原則,即在增加新功能時,無需修改現有代碼。通過組合模式,我們可以輕松地在樹形結構中添加或刪除節點,而不會影響其他部分的代碼。這種靈活性使得組合模式在處理復雜層次結構時顯得尤為強大。
二、組合模式的結構
2.1 抽象組件角色(Component)
抽象組件角色是組合模式中的核心,它定義了樹結構中所有對象的公共接口和方法。這個角色通常是一個接口或抽象類,它聲明了所有子類都必須實現的方法,如添加子節點、刪除子節點等操作。通過抽象組件角色,客戶端可以一致地對待所有對象,無論是葉子節點還是容器節點。
抽象組件角色的主要職責是提供一個統一的操作接口,使得客戶端可以在不知道具體對象類型的情況下進行操作。例如,在一個圖形用戶界面中,抽象組件角色可以定義繪制、移動和縮放等操作,無論是按鈕、文本框還是復合面板,都必須實現這些方法。這樣,客戶端就可以以相同的方式處理所有這些組件,而無需關心它們的具體類型。
public interface Component {void operation();void add(Component component);void remove(Component component);Component getChild(int index);
}
2.2 葉子節點角色(Leaf)
葉子節點角色表示樹結構中的末端節點,它不包含