组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
正如介绍所说的组合模式,组合模式我们经常使用。常用于构建一些树形结构,如省市联动的时候就可以使用该模式去构建对象。查询机构列表的时候也可以。
上demo
package cn.myproject.hzq.designpattern.composite;
import java.util.ArrayList;
import java.util.List;
/**
* 这是一个数节点。用来演示组合模式
* @author hzq
**/
public class TreeNode {
private String nodeValue;
private List<TreeNode> childNodes = new ArrayList<>();
@Override
public String toString() {
return "TreeNode{" +
"nodeValue='" + nodeValue + '\''+" 直系子节点有"+childNodes.size() +
'}';
}
public TreeNode(String nodeValue) {
this.nodeValue = nodeValue;
}
public List<TreeNode> getChildNodes() {
return childNodes;
}
}
简单的构造一个对象。
package cn.myproject.hzq.designpattern.composite;
import java.util.List;
/**
* 组合模式
* @author hzq
**/
public class CompositePatternDemo {
public static void main(String[] args){
//构造父节点
TreeNode treeNode = new TreeNode("treeNode");
//子节点1
TreeNode treeNodeChildOne = new TreeNode("treeNodeChildOne");
//子节点2
TreeNode treeNodeChildTwo = new TreeNode(
"treeNodeChildTwo");
//子节点3
TreeNode treeNodeChildThree = new TreeNode(
"treeNodeChildThree");
//父节点添加子节点
treeNode.getChildNodes().add(treeNodeChildOne);
treeNode.getChildNodes().add(treeNodeChildTwo);
treeNode.getChildNodes().add(treeNodeChildThree);
//子节点2 的子节点1
TreeNode treeNodeChildTwoChildOne = new TreeNode(
"treeNodeChildTwoChildOne");
//子节点2 的子节点2
TreeNode treeNodeChildTwoChildTwo = new TreeNode(
"treeNodeChildTwoChildTwo");
treeNodeChildTwo.getChildNodes().add(treeNodeChildTwoChildOne);
treeNodeChildTwo.getChildNodes().add(treeNodeChildTwoChildTwo);
//子节点3 的子节点1
TreeNode treeNodeChildThreeChildOne = new TreeNode(
"treeNodeChildThreeChildOne");
treeNodeChildThree.getChildNodes().add(treeNodeChildThreeChildOne);
System.out.println(treeNode.toString());
//当然正常应该使用递归的方式来调用 。这是已知最多层数才这样来的
List<TreeNode> childNodes = treeNode.getChildNodes();
for(TreeNode node : childNodes){
System.out.println(node.toString());
List<TreeNode> childNodes1 = node.getChildNodes();
if(childNodes1.size() > 0){
for (TreeNode child : childNodes1){
System.out.println(child.toString());
}
}
}
}
}