做电池的外贸网站自建网站公司
2026/2/12 5:02:45 网站建设 项目流程
做电池的外贸网站,自建网站公司,江西网站设计团队,asp无刷新网站模板文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析#xff08;JDK中的组合模式实现#xff09;0.个人感悟 组合模式的应用场景比较专#xff0c;适合树状嵌套场景JDK中的组合模式实现0.个人感悟组合模式的应用场景比较专适合树状嵌套场景统一去处理单个对象和组合对象可以扩展学习学习数据结构中的tree使用的时候注意简单对象和组合对象的一致性如果差异大不建议使用1. 概念英文定义(《设计模式可复用面向对象软件的基础》)Compose objects into tree structures to represent part-whole hierarchies. Compositelets client treat individual objects and compositions of objects uniformly.中文翻译将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。理解组合模式的核心思想是用一致的方式处理单个对象和组合对象通过树形结构组织对象形成部分-整体的层次关系客户端无需关心当前处理的是单个对象还是组合对象简化了客户端代码2. 适配场景2.1 适合的场景需要表示对象的部分-整体层次结构如文件系统、组织架构希望客户端忽略组合对象与单个对象的差异统一地使用结构中的所有对象需要对树形结构中的所有节点执行统一操作如统计、渲染、搜索系统需要动态地添加或删除组件且组件可能嵌套多层2.2 常见场景举例GUI界面开发窗口包含面板面板包含按钮、文本框等控件文件系统文件夹可以包含文件或子文件夹组织架构部门包含员工和子部门菜单系统菜单包含菜单项或子菜单图形编辑器复杂图形由简单图形组合而成3. 实现方法3.1 实现思路定义抽象组件Component接口或抽象类声明所有对象的共同接口包括管理子组件的方法添加、删除、获取子组件创建叶子Leaf类实现Component接口表示树中的叶子节点没有子节点创建组合Composite类实现Component接口包含子组件集合并实现子组件的管理方法客户端通过Component接口与所有对象交互无需区分是单个对象还是组合对象3.2 UML类图角色说明Component抽象组件定义组合对象和叶子对象的共同接口Leaf叶子没有子组件的简单对象Composite组合包含子组件的复杂对象存储和管理子组件3.3 代码示例背景:电脑文件系统支持展开梳妆结构其中叶子结点是文件复杂对象是文件夹定义统一的文件系统组件:publicabstractclassFileSystemComponent{protectedStringname;publicFileSystemComponent(Stringname){this.namename;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){}/** * description display * author bigHao * date 2026/1/11 **/publicabstractvoiddisplay();/** * param component 组件 * description 添加操作 文件不支持 * author bigHao * date 2026/1/11 **/publicvoidadd(FileSystemComponentcomponent){thrownewUnsupportedOperationException(不支持添加操作);}/** * param component 组件 * description 移除操作文件不支持 * author bigHao * date 2026/1/11 **/publicvoidremove(FileSystemComponentcomponent){thrownewUnsupportedOperationException(不支持删除操作);}/** * param index 索引 * return FileSystemComponent 子对象 * description 获取子对象 文件不支持 * author bigHao * date 2026/1/11 **/publicFileSystemComponentgetChild(intindex){thrownewUnsupportedOperationException(不支持获取子组件操作);}}叶子节点:publicclassFileextendsFileSystemComponent{privateStringextension;publicFile(Stringname,Stringextension){super(name);this.extensionextension;}Overridepublicvoiddisplay(){System.out.println(name(extension));}publicStringgetExtension(){returnextension;}publicvoidsetExtension(Stringextension){this.extensionextension;}}组合节点: 注意children属性publicclassFolderextendsFileSystemComponent{privateListFileSystemComponentchildren;publicFolder(Stringname){super(name);this.childrennewArrayList();}Overridepublicvoiddisplay(){System.out.println(folder: name);for(FileSystemComponentcomponent:children){component.display();}}Overridepublicvoidadd(FileSystemComponentcomponent){children.add(component);}Overridepublicvoidremove(FileSystemComponentcomponent){children.remove(component);}OverridepublicFileSystemComponentgetChild(intindex){if(index0indexchildren.size()){returnchildren.get(index);}returnnull;}publicintgetChildCount(){returnchildren.size();}publicListFileSystemComponentgetChildren(){returnnewArrayList(children);}}测试和输出:publicclassClient{staticvoidmain(){System.out.println(文件系统示例 \n);// 创建文件FileSystemComponentfile1newFile(document.txt,txt);FileSystemComponentfile2newFile(image.jpg,jpg);FileSystemComponentfile3newFile(data.pdf,pdf);FileSystemComponentfile4newFile(program.exe,exe);FileSystemComponentfile5newFile(config.ini,ini);// 创建文件夹FolderrootnewFolder(我的电脑);FolderdocumentsnewFolder(文档);FolderimagesnewFolder(图片);FoldersystemnewFolder(系统);// 构建文件夹结构documents.add(file1);documents.add(file3);images.add(file2);system.add(file4);system.add(file5);root.add(documents);root.add(images);root.add(system);// 显示文件系统结构System.out.println(1. 完整的文件系统结构);root.display();}}文件系统示例 完整的文件系统结构 folder: 我的电脑 folder: 文档 document.txt(txt) data.pdf(pdf) folder: 图片 image.jpg(jpg) folder: 系统 program.exe(exe) config.ini(ini)4. 优缺点4.1 优点符合开闭原则添加新类型的组件如链接文件无需修改现有代码提高复用性可以复用叶子节点和组合节点构建复杂的层次结构增强可维护性简化客户端代码客户端无需关心是单个对象还是组合对象提高可读性通过树形结构清晰地表达了部分-整体的关系支持递归组合可以方便地构建任意复杂的对象结构4.2 缺点设计较为抽象增加了系统的抽象性和理解难度类型检查问题在运行时可能需要类型检查来确定具体类型性能考虑对于深层次的树结构递归操作可能有性能开销5. 源码分析JDK中的组合模式实现JDK中的map很典型地体现了组合模式思想map接口中包含了一些列map增删方法同时putAll方法可以接受另一个Mappublicstaticvoidmain(String[]args){// 叶子MapString,Integermap1newHashMap();map1.put(A,1);map1.put(B,2);// 叶子MapString,Integermap2newHashMap();map2.put(C,3);// 组合MapString,MapString,IntegernestedMapnewHashMap();nestedMap.put(Nested,map1);//MapString,ObjectresultnewHashMap();result.putAll(map1);result.putAll(map2);// 添加嵌套Mapresult.put(NestedMap,nestedMap);System.out.println(result);}putAll的定义publicinterfaceMapK,V{// ... 其他方法// putAll方法接受另一个Map可以看作组合对象voidputAll(Map?extendsK,?extendsVm);}HashMap实现publicclassHashMapK,VextendsAbstractMapK,VimplementsMapK,V,Cloneable,Serializable{OverridepublicvoidputAll(Map?extendsK,?extendsVm){// 这里的m可以是单个HashMap也可以是嵌套的Map结构// 客户端不需要知道m的具体结构统一对待for(Map.Entry?extendsK,?extendsVe:m.entrySet())put(e.getKey(),e.getValue());}}分析Map接口充当了抽象组件角色简单的map实例可以看作是叶子节点包含其他Map的Map可以看作是组合节点putAll方法允许客户端统一处理单个Map和嵌套的Map结构客户端代码不需要关心Map内部的具体结构只需通过统一接口操作注意严格来说JDK的Map实现不是标准的组合模式因为它没有明确定义Component、Leaf、Composite的层次结构但它体现了组合模式的核心思想——统一处理单个对象和组合对象参考韩顺平 Java设计模式张维鹏 Java设计模式之结构型组合模式kosamino 设计模式之组合模式Composite详解及代码示例

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询