设计模式——组合模式
介绍
用于把一组相似的对象当作一个单一的对象,通常以树形解构来组合对象,用于表示部分以及整体层次。
意图
将对象组合成树形解构表示“部分-整体”的结构层次。组合模式是的用于对单个对象和组合对象的使用具有一致性。
解决
它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
优点
- 高层模块调用简单;
- 节点自由增加。
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景
部分、整体场景,如树形菜单,文件、文件夹的管理。
UML

示例
树节点 TreeNode.java
package cn.geoaryblog.design.cretedg.composite;
import java.util.ArrayList;
import java.util.List;
public class TreeNode {
private String name;
private List<TreeNode> treeNodeList = null;
public TreeNode(String name) {
this.name = name;
}
public String getName() {
return name;
}
public List<TreeNode> getTreeNodeList() {
return treeNodeList;
}
public synchronized void addNode(TreeNode treeNode){
if (treeNodeList == null){
treeNodeList = new ArrayList<>();
}
treeNodeList.add(treeNode);
}
@Override
public String toString() {
return "TreeNode{" +
"name='" + name + '\'' +
'}';
}
}
客户端 Clinet.java
package cn.geoaryblog.design.cretedg.composite;
public class Clinet {
public static void main(String[] args) {
TreeNode rootNode = new TreeNode("根节点");
TreeNode cDisk = new TreeNode("c盘");
TreeNode dDisk = new TreeNode("d盘");
TreeNode programFile = new TreeNode("Program Files");
dDisk.addNode(programFile);
rootNode.addNode(cDisk);
rootNode.addNode(dDisk);
System.out.println(rootNode);
for(TreeNode rootSub: rootNode.getTreeNodeList()){
System.out.println(rootSub);
if(rootSub.getName() == "d盘"){
for(TreeNode dp: dDisk.getTreeNodeList()){
System.out.println(dp);
}
}
}
}
}

浙公网安备 33010602011771号