1.意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
2.特点
想表示对象的部分-整体层次结构。
希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
通常树形结构的表都会用到组合模式。
3.UML类图
4.代码
/**
* 节点类(部分) 定义必要的属性 id,parentId,children
*/
public class TreeNode {
private String id;//节点ID
private String name;//节点名称
private String parentId;//父节点ID
private Vector<TreeNode> children = new Vector<TreeNode>();//子节点集合
public TreeNode(String id,String name,String parentId){
this.id = id;
this.name = name;
this.parentId = parentId;
}
public boolean addChild(TreeNode child){
return children.add(child);
}
public boolean remove(TreeNode child){
return children.remove(child);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Vector<TreeNode> getChildren() {
return children;
}
}
/**
* 树类(整体) 定义根节点
*/
public class Tree {
private TreeNode root;
public Tree(){
this.root = new TreeNode("0","root","");
}
public TreeNode getRoot() {
return root;
}
public void printTree(TreeNode printNode){
if(printNode.getChildren().size()==0){
return;
}else{
printNode.getChildren().forEach((TreeNode node)->{
System.out.println(node.getName());
printTree(node);
});
};
}
}
public class CompositeTest {
public static void main(String[] args) {
Tree tree = new Tree();
TreeNode node1 = new TreeNode("1","1","0");
TreeNode node11 = new TreeNode("11","11","1");
TreeNode node12 = new TreeNode("12","12","1");
node1.addChild(node11);
node1.addChild(node12);
TreeNode node2 = new TreeNode("2","2","0");
TreeNode node21 = new TreeNode("21","21","2");
TreeNode node22 = new TreeNode("22","22","2");
node2.addChild(node21);
node2.addChild(node22);
tree.getRoot().addChild(node1);
tree.getRoot().addChild(node2);
tree.printTree(tree.getRoot());
}
}