組合模式:
組合模式(Composite):将對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性。
組合模式UMl結構圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP31mW14ESlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM1gTOyQTNzEjMyQDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
java代碼實作:
/**
*Compoent為組合中的對象聲明一個接口
*在适當情況下,實作所有類共有接口的預設行為。
*聲明一個接口用于通路和管理Compoent的子部件
*/
public abstract class Compoent {
protected String name;
public Compoent(String name) {
super();
this.name = name;
}
//通常用add和remove方法來提供增加和移除樹葉或樹枝的功能
public abstract void add(Compoent c);
public abstract void reomve(Compoent c);
public abstract void display(int depth);
}
//Leaf在組合表示樹葉節點,樹葉沒有子節點
public class Leaf extends Compoent{
public Leaf(String name) {
super(name);
}
/**
* 由于樹葉沒有再增加分支和樹葉,是以Add和remove方法再實作他們沒有意義
* 但這樣做可以消除葉節點和枝節點在抽象層次的差別,他們具備完全一緻的接口
*/
@Override
public void add(Compoent c) {
System.out.println("不能再增加子節點");
}
@Override
public void reomve(Compoent c) {
System.out.println("沒有子節點可以被移除");
}
@Override
public void display(int depth) {
//葉節點的具體方法,此處是顯示其名稱和級别
System.out.println("-"+depth+name);
}
}
public class Composite extends Compoent{
private List<Compoent> childen = new ArrayList<Compoent>();
public Composite(String name) {
super(name);
}
@Override
public void add(Compoent c) {
childen.add(c);
}
@Override
public void reomve(Compoent c) {
childen.remove(c);
}
@Override
public void display(int depth) {
//顯示其枝節點名稱,并對其下級周遊
System.out.println("-"+depth+name);
for (Compoent compoent : childen) {
compoent.display(depth+2);
}
}
}
public class Mian {
public static void main(String[] args) {
//生成跟節點root ,根上長有兩個子節點LeafA和LeafB
Composite root = new Composite("root");
root.add(new Leaf("Leaf A"));
root.add(new Leaf("Leaf B"));
//根上長有一個分支compositex,分支上長有兩篇樹葉Leaf XA和Leaf XB
Composite compositex = new Composite("Composite X");
compositex.add(new Leaf("Leaf XA"));
compositex.add(new Leaf("Leaf XB"));
root.add(compositex);
//分支compositex上長有另一個分支compositeXy
//并且另一個分支compositeXy上又長有兩個樹葉Leaf XYA和Leaf XYB
Composite compositeXy = new Composite("Composite XY");
compositeXy.add(new Leaf("Leaf XYA"));
compositeXy.add(new Leaf("Leaf XYB"));
compositex.add(compositeXy);
//樹根root上又長了兩片樹葉Leaf C和Leaf D
//但是Leaf D沒長牢,被風吹走了
root.add(new Leaf("Leaf C"));
Leaf leaf = new Leaf("Leaf D");
root.add(leaf);
root.reomve(leaf);
//顯示大樹的樣子
root.display(1);
}
}
組合模式使用場景:
當你發現需求中是展現部分與整體層次的結構時,以及你希望客戶忽略組合對象和單個對象的不同,同一地使用組合結構的所有對象時,就應該考慮組合模式。