程序员人生 网站导航

设计模式8――组合模式

栏目:框架设计时间:2015-04-24 08:09:45

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.总结

           很久没写博客,捡起来。学如逆水行舟,不进则退。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐