設計模式8――組合模式
來源:程序員人生 發布時間:2015-04-24 08:09:45 閱讀次數:4039次
1.生活實例
組合模式首先想到的就是樹形結構,比如我們經常使用的文件結構,請看Windows的文件結構:

不管是文件或是文件夾,經常使用操作都是1致的,比如:復制、粘貼、剪切、刪除、所占空間大小。我們并沒有刻意的去分他是文件夾還是文件。
我們可以把文件夾看成是組合對象,把每個文件看成是單個對象。組合模式模糊了這兩個概念,他使得客戶端能夠用簡單1致的操作來操作兩個不同的東西。
2.定義解析
將對象組合成樹形結構以表示“部份-整體”的層次結構。組合模式使得用戶對單個對象的使用具有1致性。

Client:客戶端。
Component:定義組合對象的接口。
Leaf:組合對象中的葉子,實現Component接口。
Composite:組合對象中的節點,組合所有葉子,實現Component接口,并且可以刪除和增加葉子。
3.代碼分析
Component
public interface Component {
public void show();
public void isChild(int pFatherLevel);
}
Composite
public class Composite implements Component {
private String mName;
private int mLevel;
private ArrayList<Component> mList = new ArrayList<Component>();
public Composite(String pName) {
mName = pName;
mLevel = 0;
}
public void add(Component pComponent) {
pComponent.isChild(mLevel);
mList.add(pComponent);
}
public void remove(Component pComponent) {
mList.remove(pComponent);
}
@Override
public void show() {
showLevel();
for (Component component : mList) {
component.show();
}
}
@Override
public void isChild(int pFatherLevel) {
mLevel = pFatherLevel + 1;
}
private void showLevel() {
for (int i = 0; i < mLevel; i++) {
System.out.print("-");
}
System.out.println(mName);
}
}
Leaf
public class Leaf implements Component {
private String mName;
private int mLevel;
public Leaf(String pName) {
mName = pName;
mLevel = 0;
}
@Override
public void show() {
showLevel();
}
@Override
public void isChild(int pFatherLevel) {
mLevel = pFatherLevel + 1;
}
private void showLevel() {
for (int i = 0; i < mLevel; i++) {
System.out.print("-");
}
System.out.println(mName);
}
}
Client
public class CompositeTest {
// 類似2叉樹這樣的結構
public static void main(String[] args) {
Composite composite1 = new Composite("節點1");
Composite composite2 = new Composite("節點2");
Leaf leaf1 = new Leaf("葉子1");
Leaf leaf2 = new Leaf("葉子2");
Leaf leaf3 = new Leaf("葉子3");
Leaf leaf4 = new Leaf("葉子4");
Leaf leaf5 = new Leaf("葉子5");
composite1.add(leaf1);
composite1.add(leaf2);
composite1.add(composite2);
composite2.add(leaf3);
composite2.add(leaf4);
composite2.add(leaf5);
composite1.show();
}
}
打印結果:
節點1
-葉子1
-葉子2
-節點2
--葉子3
--葉子4
--葉子5
4.總結
很久沒寫博客,撿起來。學如逆水行舟,不進則退。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈