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.总结
很久没写博客,捡起来。学如逆水行舟,不进则退。