組合模式用于組合多個對象形成樹形結(jié)構(gòu)以表示具有部分-整體關(guān)系的層次結(jié)構(gòu)硫眯。組合模式讓客戶端可以統(tǒng)一對待單個對象和組合對象忘朝。組合模式又可以稱為“部分-整體”模式,是一種對象結(jié)構(gòu)型模式泉坐。
組合模式使用面向?qū)ο蟮乃枷雭韺崿F(xiàn)樹形結(jié)構(gòu)的構(gòu)建與處理为鳄,描述了如何將容器對象和葉子對象進行遞歸組合,實現(xiàn)簡單腕让,靈活性好孤钦。
組合模式的結(jié)構(gòu)與實現(xiàn):
1.Component(抽象構(gòu)件):可以為抽象類或接口,為葉子構(gòu)件和容器構(gòu)件對象聲明接口纯丸,在該角色中可以包含所有子類共有行為的聲明偏形。在抽象構(gòu)件中定義了訪問及管理它的子構(gòu)件的方法,如增加子構(gòu)件觉鼻,刪除子構(gòu)件俊扭,獲取子構(gòu)件等。
public abstract class Component {
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract Component getChild(int node);
public abstract void operation();
}
2.Composite(容器構(gòu)件):它在組合結(jié)構(gòu)中表示容器結(jié)點對象坠陈,容器結(jié)點包含子節(jié)點萨惑,其子結(jié)點可以是葉子結(jié)點捐康,也可以是容器結(jié)點,它提供一個集合用于儲存子結(jié)點庸蔼,實現(xiàn)了抽象構(gòu)件中定義的行為解总,包括那些訪問及管理子構(gòu)件的方法,在其業(yè)務方法中可以遞歸調(diào)用子結(jié)點的業(yè)務方法朱嘴。
public class Composite extends Component {
private List<Component> list=new ArrayList<>();
private String text;
public Composite(String text) {
this.text=text;
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
list.remove(component);
}
@Override
public Component getChild(int node) {
return list.get(node);
}
@Override
public void operation() {
System.out.println("獲取到構(gòu)件內(nèi)容:"+text);
//遞歸調(diào)用構(gòu)件的方法
for (Component component : list) {
component.operation();
}
}
}
3.Leaf(葉子構(gòu)件):他在組合結(jié)構(gòu)中表示葉子結(jié)點對象倾鲫,葉子結(jié)點沒有子節(jié)點,它實現(xiàn)了在抽象構(gòu)件中定義的行為萍嬉。對于那些訪問及管理子構(gòu)件的方法乌昔,可以通過拋出異常,提示錯誤等方式處理壤追。
public class Leaf extends Component {
private String text;
public Leaf(String text) {
this.text=text;
}
@Override
public void add(Component component) {
// 錯誤提示
}
@Override
public void remove(Component component) {
// 錯誤提示
}
@Override
public Component getChild(int node) {
// 錯誤提示
return null;
}
@Override
public void operation() {
//葉子構(gòu)件具體業(yè)務方法的實現(xiàn)
System.out.println("獲取到葉子結(jié)點內(nèi)容:"+text);
}
}
- Test:
public class Test {
public static void main(String[] args) {
Component component1,component2;
component1=new Composite("component1");
component2=new Composite("component2");
Component leaf1,leaf2,leaf3,leaf4;
leaf1=new Leaf("component1+leaf1");
leaf2=new Leaf("component1+leaf2");
leaf3=new Leaf("component2+leaf3");
leaf4=new Leaf("component2+leaf4");
component1.add(leaf1);
component1.add(leaf2);
component2.add(leaf3);
component2.add(leaf4);
component1.operation();
component2.operation();
}
}
運行內(nèi)容:
獲取到構(gòu)件內(nèi)容:component1
獲取到葉子結(jié)點內(nèi)容:component1+leaf1
獲取到葉子結(jié)點內(nèi)容:component1+leaf2
獲取到構(gòu)件內(nèi)容:component2
獲取到葉子結(jié)點內(nèi)容:component2+leaf3
獲取到葉子結(jié)點內(nèi)容:component2+leaf4