組合模式-Composite Pattern
阿新 • • 發佈:2019-01-28
意圖:
將物件組合成樹形結構以表示”部分-整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。
主要解決:
它在我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。
何時使用:
- 您想表示物件的部分-整體層次結構(樹形結構)。
- 您希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
如何解決:
樹枝和葉子實現統一介面,樹枝內部組合該介面。
關鍵程式碼:
樹枝內部組合該介面,並且含有內部屬性 List,裡面放 Component。
應用例項:
- 算術表示式包括運算元、操作符和另一個運算元,其中,另一個操作符也可以是操作樹、操作符和另一個運算元。
- 在 JAVA AWT 和 SWING 中,對於 Button 和 Checkbox 是樹葉,Container 是樹枝。
優點:
- 高層模組呼叫簡單。
- 節點自由增加。
缺點:
在使用組合模式時,其葉子和樹枝的宣告都是實現類,而不是介面,違反了依賴倒置原則。
使用場景:
部分、整體場景,如樹形選單,檔案、資料夾的管理。
注意事項:
定義時為具體類。
通用類圖:
通用原始碼:
抽象構件
public abstract class Component {
//個體和整體都具有的共享
public void doSomething(){
//編寫業務邏輯
}
}
樹枝構件
public class Composite extends Component {
//構件容器
private ArrayList<Component> componentArrayList = new ArrayList<Component>();
//增加一個葉子構件或樹枝構件
public void add(Component component){
this .componentArrayList.add(component);
}
//刪除一個葉子構件或樹枝構件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//獲得分支下的所有葉子構件和樹枝構件
public ArrayList<Component> getChildren(){
return this.componentArrayList;
}
}
樹葉構件
public class Leaf extends Component {
/*
* 可以覆寫父類方法
* public void doSomething(){
*
* }
*/
}
場景類
public class Client {
public static void main(String[] args) {
//建立一個根節點
Composite root = new Composite();
root.doSomething();
//建立一個樹枝構件
Composite branch = new Composite();
//建立一個葉子節點
Leaf leaf = new Leaf();
//建立整體
root.add(branch);
branch.add(leaf);
}
//通過遞迴遍歷樹
public static void display(Composite root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //葉子節點
c.doSomething();
}else{ //樹枝節點
display((Composite)c);
}
}
}
}