设计模式——组合模式
介绍
用于把一组相似的对象当作一个单一的对象,通常以树形解构来组合对象,用于表示部分以及整体层次。
意图
将对象组合成树形解构表示“部分-整体”的结构层次。组合模式是的用于对单个对象和组合对象的使用具有一致性。
解决
它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
优点
- 高层模块调用简单;
- 节点自由增加。
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景
部分、整体场景,如树形菜单,文件、文件夹的管理。
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);
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)