Structual设计-Composite形式

Structual设计--Composite模式

1.意图

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

2.别名

3.动机

在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表。用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件。一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container)。
然而存在一个问题:使用这些类的代码必需区别对待图元对象和容器对象,而实际上大多数情况下用户认为他们是一样的。对这些类区别使用,使得程序更加复杂。Composite模式描述了如何使用递归组合,使得用户不必对这些类进行区别。

4.适用性

以下情况使用Composite:

  • 你想表示对象的整体-部分层次结构。
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

5.结构

组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:
Structual设计-Composite形式

6.代码示例

看下代码:

public class TreeNode {

    private String name;
    private TreeNode parent;
    private Vector<TreeNode> children = new Vector<TreeNode>();

    public TreeNode(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TreeNode getParent() {
        return parent;
    }

    public void setParent(TreeNode parent) {
        this.parent = parent;
    }

    //添加孩子节点
    public void add(TreeNode node){
        children.add(node);
    }

    //删除孩子节点
    public void remove(TreeNode node){
        children.remove(node);
    }

    //取得孩子节点
    public Enumeration<TreeNode> getChildren(){
        return children.elements();
    }
}

调用者:

public class Tree {

    TreeNode root = null;

    public Tree(String name) {
        root = new TreeNode(name);
    }

    public static void main(String[] args) {
        Tree tree = new Tree("A");
        TreeNode nodeB = new TreeNode("B");
        TreeNode nodeC = new TreeNode("C");

        nodeB.add(nodeC);
        tree.root.add(nodeB);
        System.out.println("build the tree finished!");
    }
}

其中TreeNode作为组合器,使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等。

7.相关模式

  • 通常部件-父部件连接用于Responsibility of Chain模式(责任链)。
  • Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,他们通常有一个公共的父类。因此装饰必须支持具有add,remove和GetChild操作的Component接口。
  • Flyweight让你共享组件,但不在能引用他们的父部件。
  • Itertor可以来遍历Composite
  • Visitor将本来应该分布在Composite和leaf类中的操作和行为局部化。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539