Java设计模式概述之结构型模式(组合模式)
四、组合模式(Composite)
组合模式相对不好阐述。引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”
组合模式与树形结构程序设计是密不可分的。组合模式很好的体现了“整体——部分”的关系。
下面给大家一段自己写的有关组合模式的代码:
import java.util.Enumeration;
import java.util.Vector;
/**
* @author Hanlin Wang
*/
public class CompositeMode {
public static void main(String[] args) {
TreeNode A = new TreeNode("A");
TreeNode B = new TreeNode("B");
TreeNode C = new TreeNode("C");
TreeNode D = new TreeNode("D");
TreeNode E = new TreeNode("E");
TreeNode F = new TreeNode("F");
TreeNode G = new TreeNode("G");
TreeNode H = new TreeNode("H");
TreeNode I = new TreeNode("I");
TreeNode J = new TreeNode("J");
TreeNode K = new TreeNode("K");
TreeNode L = new TreeNode("L");
TreeNode M = new TreeNode("M");
TreeNode N = new TreeNode("N");
TreeNode O = new TreeNode("O");
A.addChild(B);
A.addChild(C);
B.addChild(D);
B.addChild(E);
C.addChild(F);
C.addChild(G);
D.addChild(H);
D.addChild(I);
E.addChild(J);
E.addChild(K);
F.addChild(L);
F.addChild(M);
G.addChild(N);
G.addChild(O);
TreeNode.showTreeNodes(A);
/*
* 运行结果:
*
* A节点的子元素: B C
* B节点的子元素: D E
* D节点的子元素: H I
* E节点的子元素: J K
* C节点的子元素: F G
* F节点的子元素: L M
* G节点的子元素: N O
*/
}
}
//定义节点类
class TreeNode{
private String nodeName;
private Vector<TreeNode> children = new Vector<TreeNode>();
public TreeNode(String nodeName){
this.nodeName = nodeName;
}
public String getNodeName() {
return nodeName;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public Enumeration<TreeNode> getChildren() {
return children.elements();
}
public void addChild(TreeNode node) {
children.add(node);
}
public static void showTreeNodes(TreeNode node){
Enumeration<TreeNode> children = node.getChildren();
System.out.print(node.getNodeName()+"节点的子元素: ");
while (children.hasMoreElements()) {
TreeNode subNode = children.nextElement();
System.out.print(subNode.getNodeName()+" ");
}
Enumeration<TreeNode> children2 = node.getChildren();
while (children2.hasMoreElements()) {
TreeNode subNode = children2.nextElement();
if (subNode.getChildren().hasMoreElements()) {
System.out.println();
showTreeNodes(subNode);
}
}
}
}
TreeNode是基本的节点类,里面定义了一个Vector类型的children成员变量和一系列操纵叶子节点的方法。最后还定义了一个showTreeNodes方法用于打印本节点及本节点以下的所有的叶子节点。
注意,showTreeNodes方法中会判断下一个叶子节点内的节点是否还有子节点,如果有,对showTreeNodes方法本身进行递归调用。