composite

第十章 组合模式(Composite Pattern)

1 概要

组合模式(Command Pattern)是一种结构模式(Structural Design Pattern)。它主要用于使用统一的接口来表达复杂的树状结构。在这个树状结构中可包含单个对象或者组合对象,并且单个对象和组合对象保持一致的接口。组合模式有以下几个要点。

  1. 组合模式以树状结构来表达对象。这个树状结构可以包含单一对象或者组合对象。我们可以借用文件系统的概念来理解这句话的意思。文件系统是使用一棵树来表达该文件系统中所有的文件的。每一个文件是一个单一对象,而目录则是一个组合对象,因为一个目录可以包含多个目录或者文件。因此,这里体现的是组合结构的“递归”特性,即一个组合对象可以包含另一个组合对象。
  2. 在组合模式下,单一对象和组合对象保持接口一致,即单一对象和组合对象有着相同的函数或者接口。因此,传统的文件系统符合第一点,但是不满足第二点,因为传统文件系统的文件操作接口和目录操作接口是不同的。

2 组合模式的结构

在组合模式中,有四个参与方。

  1. ComponentBase接口定义了单一对象和组合对象的统一接口。
  2. Leaf类实现了ComponentBase接口,用于表示组合模式下的单一对象。
  3. ComponentSet类实现了ComponentBase接口,用于表示组合模式下的组合对象。它能够包含多个ComponentBase对象。
  4. Client(客户)是使用ComponentBase接口的调用者。

图一 组合模式结构

图一 组合模式结构。

3 组合模式示例

我们使用一个简单的用例来展示组合模式的使用方法。这个例子表示的是一个树,树中包含叶子节点(LeafNode)和中间节点(IntermediateNode)。它们都实现了Node接口。叶子节点包含一个整数数值;中间节点则可能包含0个、1个或者多个节点。

Node接口定义了一个成员方法sum(),用于计算以该节点为根结点的子树中所有叶子节点的和。

public interface Node {
    int sum(); 
}

所以,如果当前节点是叶子节点,那么,sum()方法直接返回当前节点的值。

public class LeafNode implements Node {
    private int value;

    public LeafNode(int value) {
        this.value = value;
    }

    @Override
    public int sum() {
        return value;
    }
}

如果当前是中间节点,则sum()方法会将其所有的孩子节点的数值累加起来。

public class IntermediateNode implements Node {
    private List<Node> children = new ArrayList<Node>();

    public void addNode(Node child) {
        children.add(child);
    }

    @Override
    public int sum() {
        int sum = 0;
        for (Node child: children) {
            sum += child.sum();
        }
        return sum;
    }
}

所以,当一颗树建立起来之后,我们可以计算以任意节点为根结点的子树的和。

public class CompositePatternClient {
    Component root = new IntermediateNode();
    root.addNode(new LeafNode(5));

    Component child = new IntermediateNode();
    child.addNode(new LeafNode(10));
    root.addNode(child);
    
    System.out.println(root.sum());
}

以上是组合模式的基本使用方法。组合模式的结构与其他模式有着相似之处。组合模式的特点在于叶子节点和中间节点的接口需保持一致,因为它们继承自相同的接口ComponentBase。第二个特点是中间节点为组合模式的接口增加了递归性。理论上,使用组合模式的结构体可以无限大,即该结构体可以有无限多个层级;每个层级中可以有无限个元素。

4 小结

本章介绍了组合模式的结构和使用方法。组合模式非常适合用于表达数状的结构或者数据。在树中,每个节点有着相同的接口,但是其内部实现可以互不相同。组合模式并未对节点的种类和实现方式有任何限制。一个组合模式的结构可以有两种或者多种节点类型。

 

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.