八、组合模式

张开发
2026/4/9 3:33:19 15 分钟阅读

分享文章

八、组合模式
目的 将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。核心 定义统一的组件接口Component叶子节点Leaf实现基本操作容器节点Composite包含子组件并管理它们添加、删除、遍历。场景 常用于构建树形结构如文件系统、菜单系统等。函数入口packagecomposite;importjava.util.List;/* 组合模式演示 - 入口函数 展示树形结构的构建和遍历 */publicclassMain{publicstaticvoidmain(String[]args){// 构建文件系统结构demonstrateFileSystem();}// 文件系统结构privatestaticvoiddemonstrateFileSystem(){System.out.println(\n--- 文件系统结构 ---);// 创建文件系统树TreefileSystemnewTree(D:);// 获取根节点TreeNoderootfileSystem.getRoot();// 创建目录和文件TreeNodeprogramFilesnewTreeNode(Program Files);TreeNodeusersnewTreeNode(Users);TreeNodewindowsnewTreeNode(Windows);// 向Program Files添加子节点TreeNodejavaDirnewTreeNode(Java);javaDir.add(newTreeNode(jdk1.8.0));programFiles.add(javaDir);// 向Users添加子节点TreeNodeuserJohnnewTreeNode(John);userJohn.add(newTreeNode(Music));users.add(userJohn);TreeNodeuserAlicenewTreeNode(Alice);userAlice.add(newTreeNode(Pictures));users.add(userAlice);// 向Windows添加子节点windows.add(newTreeNode(System64));// 将所有目录添加到根节点root.add(programFiles);root.add(users);root.add(windows);// 打印文件系统结构printTreeStructure(fileSystem.getRoot());}// 打印树形结构privatestaticvoidprintTreeStructure(TreeNoderoot){if(rootnull){System.out.println(空树);return;}printTreeNode(root,0);}// 递归打印节点privatestaticvoidprintTreeNode(TreeNodenode,intdepth){StringindentbuildIndent(depth);StringnodeTypenode.isLeaf()?:;// 使用图标区分类型Stringprefixnode.isRoot()? : ;System.out.println(indentprefixnodeType node.getName());ListTreeNodechildrennode.getChildren();for(TreeNodechild:children){printTreeNode(child,depth1);}}// 构建缩进字符串privatestaticStringbuildIndent(intdepth){StringBuildersbnewStringBuilder();for(inti0;idepth;i){sb.append( );}returnsb.toString();}ListTreeNodechildrennode.getChildren();for(TreeNodechild:children){printTreeNode(child,depth1);}}// 构建缩进字符串privatestaticStringbuildIndent(intdepth){StringBuildersbnewStringBuilder();for(inti0;idepth;i){sb.append( );}returnsb.toString();}}然后是树节点类 - 组合模式中的Component同时充当Leaf和Composite的角色当没有子节点时作为Leaf当有子节点时作为Compositepackagecomposite;importjava.util.ArrayList;importjava.util.List;publicclassTreeNode{privateStringname;// 节点名称privateTreeNodeparent;// 父节点引用privateListTreeNodechildren;// 子节点列表publicTreeNode(Stringname){this.namename;this.childrennewArrayList();// 初始化子节点列表}// Getter和Setter方法 publicvoidsetName(Stringname){this.namename;}publicStringgetName(){returnthis.name;}publicvoidsetParent(TreeNodeparent){this.parentparent;}publicTreeNodegetParent(){returnthis.parent;}// 获取子节点列表返回不可修改的列表以保证封装性publicListTreeNodegetChildren(){returnnewArrayList(this.children);// 返回副本保护内部数据}// 组合模式的核心操作 // 添加子节点publicvoidadd(TreeNodenode){if(nodenull){thrownewIllegalArgumentException(不能添加空节点);}if(nodethis){thrownewIllegalArgumentException(不能添加自身作为子节点);}this.children.add(node);node.setParent(this);// 设置子节点的父节点为当前节点}// 移除子节点publicvoidremove(TreeNodenode){if(node!nullthis.children.remove(node)){node.setParent(null);// 清除被移除节点的父节点引用}}// 判断是否为叶子节点没有子节点publicbooleanisLeaf(){returnthis.children.isEmpty();}// 判断是否为根节点没有父节点publicbooleanisRoot(){returnthis.parentnull;}}最后是树类 - 组合模式的客户端使用类封装了对树形结构的整体操作提供更友好的APIpackagecomposite;publicclassTree{privateTreeNoderoot;// 根节点publicTree(Stringname){this.rootnewTreeNode(name);}// 获取根节点publicTreeNodegetRoot(){returnroot;}}会打印--- 文件系统结构 --- D: Program Files Java jdk1.8.0 Users John Music Alice Pictures Windows System64

更多文章