组合模式(Command Pattern)是一种结构模式(Structural Design Pattern)。它主要用于使用统一的接口来表达复杂的树状结构。在这个树状结构中可包含单个对象或者组合对象,并且单个对象和组合对象保持一致的接口。组合模式有以下几个要点。
在组合模式中,有四个参与方。
图一 组合模式结构。
我们使用一个简单的用例来展示组合模式的使用方法。这个例子表示的是一个树,树中包含叶子节点(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。第二个特点是中间节点为组合模式的接口增加了递归性。理论上,使用组合模式的结构体可以无限大,即该结构体可以有无限多个层级;每个层级中可以有无限个元素。
本章介绍了组合模式的结构和使用方法。组合模式非常适合用于表达数状的结构或者数据。在树中,每个节点有着相同的接口,但是其内部实现可以互不相同。组合模式并未对节点的种类和实现方式有任何限制。一个组合模式的结构可以有两种或者多种节点类型。
注册用户登陆后可留言