文章目录

  • 组合模式
  • UML结构图
  • 组合模式核心
  • 代码实现
  • 总结
    • 优点
    • 缺点

组合模式

组合(Composite)模式是一种对象的行为模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

UML结构图

组合模式核心

  • Component :组合中的对象声明接口,用于访问和管理Component子部件。
  • Leaf:单个/叶子对象,叶子结点没有子结点。
  • Composite:组合/容器对象,存储子部件和枝节点行为,实现与子部件有关操作,如增加(add)和删除(remove)等,list实现容器,容纳Component对象。

代码实现

抽象构建

 package com.lq.composite.v2;/*** @author lq* @PACKAGE_NAME: com.lq.composite.v2* @CLASS_NAME: Component* @date 2022/11/17 22:13* @Description:*/public abstract class Component {/*** 子组件对象的功能方法** @param preStr*/public abstract void operiation(String preStr);public void add(Component child) {// 缺省的实现,抛出异常,因为叶子对象没有这个功能,或子类未实现这个功能throw new UnsupportedOperationException("对象不支持此功能");}public void remove(Component child) {// 缺省的实现,抛出异常,因为叶子对象没有这个功能,或子类未实现这个功能throw new UnsupportedOperationException("对象不支持此功能");}public Component getChild(int index) {// 缺省的实现,抛出异常,因为叶子对象没有这个功能,或子类未实现这个功能throw new UnsupportedOperationException("对象不支持此功能");}}

Leaf节点

 package com.lq.composite.v2;/*** @author lq* @PACKAGE_NAME: com.lq.composite.v2* @CLASS_NAME: Leaf* @date 2022/11/17 22:14* @Description:  Leaf节点*/public class Leaf extends Component{private String name = "";public Leaf(String name) {this.name = name;}/*** 此处用于输出组件的树形结构*/@Overridepublic void operiation(String preStr) {System.out.println(preStr + "-" + name);}}

Composite容器

 package com.lq.composite.v2;import java.util.ArrayList;import java.util.List;/*** @author lq* @PACKAGE_NAME: com.lq.composite.v2* @CLASS_NAME: Composite* @date 2022/11/17 22:15* @Description:*/public class Composite extends Component {private String name = "";public Composite(String name) {this.name = name;}/*** 用来存储组合对象中包含的子组件对象*/private List<Component> childComponents = null;/*** 示意方法,此处用于输出组件的树形结构,通常在里面需要实现递归的调用*/@Overridepublic void operiation(String preStr) {// 先把自己输出System.out.println(preStr + "-" + name);// 如果还包含其他子组件,那么就输出这些子组件对象if (null != childComponents) {// 添加一个空格,表示向后缩进一个空格preStr += "   ";// 输出当前对象的子组件对象for (Component component : childComponents) {// 递归地进行子组件相应方法的调用,输出每个子组件对象component.operiation(preStr);}}}/*** 向组合对象中添加组件对象*/@Overridepublic void add(Component child) {// 延迟初始化if (null == childComponents) {childComponents = new ArrayList<Component>();}childComponents.add(child);}/*** 从组合对象中移除组件对象*/@Overridepublic void remove(Component child) {if (null != childComponents) {childComponents.remove(child);}}/*** 根据索引获取组合对象中对应的组件对象*/@Overridepublic Component getChild(int index) {if (null != childComponents) {if (index >= 0 && index < childComponents.size()) {return childComponents.get(index);}}return null;}}

测试

 package com.lq.composite.v2;import com.lq.composite.BranchNode;import com.lq.composite.LeafNode;import com.lq.composite.Node;/*** @author lq* @PACKAGE_NAME: com.lq.composite.v2* @CLASS_NAME: Main* @date 2022/11/17 22:17* @Description:*/public class Main {public static void main(String[] args) {// 定义多个Composite组合对象Component root = new Composite("root");Component c1 = new Composite("A");Component c2 = new Composite("B");Component c3 = new Composite("CCC");// 定义多个Leaf叶子对象Component leaf1 = new Leaf("AA");Component leaf2 = new Leaf("BB");Component leaf3 = new Leaf("CC");Component leaf4 = new Leaf("AAA");Component leaf5 = new Leaf("BBB");Component leaf6 = new Leaf("C");Component leaf7 = new Leaf("AAAA");Component leaf8 = new Leaf("BBBB");// 组合成为树形的对象结构root.add(c1);root.add(c2);root.add(leaf6);c1.add(leaf1);c1.add(leaf2);c1.add(leaf3);c2.add(leaf4);c2.add(leaf5);c2.add(c3);c3.add(leaf7);c3.add(leaf8);// 调用根对象的输出功能输出整棵树root.operiation("");}}

结果

 -root-A-AA-BB-CC-B-AAA-BBB-CCC-AAAA-BBBB-C

总结

优点

  • 统一了组合对象和叶子对象。
  • 简化了客户端调用,无须区分操作的是组合对象还是叶子对象。
  • 更容易扩展,有了Component的约束,新定义的Composite或Leaf子类能够很容易地与已有的结构一起工作。 使用组合模式的缺点:

缺点

  • 其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒转原则

Composite(组合模式)相关推荐

  1. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题 在面向对象系统中,我们常会遇到一类具有"容器"特征的对象--即他们在充当对象的同时,又是其他对象的容器. public ...

  2. java 组合代码_java实现Composite组合模式的实例代码

    //20210121 写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现组合模式 组合模式核心思想类似文件夹的概念,构件树形结构,树形有叶子结点和文件夹 ...

  3. 组合的示例代码 java_java实现Composite组合模式的实例代码

    //20210121 写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现组合模式 组合模式核心思想类似文件夹的概念,构件树形结构,树形有叶子结点和文件夹 ...

  4. C++设计模式-Composite组合模式

    Composite组合模式 作用:将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Compo ...

  5. Java 设计模式之 Composite 组合模式

    Composite  组合模式相对简单,一般用于处理树状结构,递归结构,类似计算机中的文件系统,有文件夹,文件,文件夹里可以有文件:再比如一棵树,有枝干,叶子节点组成,枝干上又有叶子. 这里以构造一棵 ...

  6. 设计模式学习笔记(九)——Composite组合模式

    Composite组合模式主要是应对这样的问题:一类具有"容器特征"的对象--即他们在充当对象的同时,又是其他对象的容器的情况.在编写时我们常常会造成:客户代码过多地依赖于对象容器 ...

  7. 设计模式(八)Composite(组合模式)

    @TOC Composite(组合模式):将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性. 结构 意图 将对象组合成树形结构以表 ...

  8. C#面向对象设计模式第九讲:Composite 组合模式(结构型模式)

    (根据MSDN Webcast相关课程整理) 由俄罗斯套娃讲起.娃娃里又包含另一个娃娃,最后那个不包含任何娃娃. 组合模式,采用树型结构来实现普遍存在的对象容器,将本原一对多的复杂的关系,转换成一对一 ...

  9. C++设计模式——Composite 组合模式

    Composite objects into a tree structure so that individual objects and compositions of objects can b ...

  10. JAVA设计模式十七--Composite(组合模式)

    组合模式 组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念   ,客户程序可以向处理简单元素一样来处理复杂元素,从而使 ...

最新文章

  1. 【商业落地篇】Gartner第四范式全球首发AutoML系列白皮书(限时免费下载)
  2. pytorch 常用层(四)
  3. ExtAspNet应用技巧(十七) - 新增菜单
  4. 20135302魏静静——linux课程第六周实验及总结
  5. pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造
  6. 基于电商消费行为金融用户的数据梳理
  7. [九度][何海涛] 变态跳台阶
  8. .NET2.0 事务处理
  9. 文本数据抽取经验总结
  10. 8086 MOV 指令的注意事项
  11. matlab数值分析代码,数值分析matlab代码
  12. Echarts formatter综合写法
  13. c语言数据结构实训报告总结,数据结构实训心得
  14. 【win 10】win 10:远程连接 Windows 服务器工具下载、安装和使用:PowerShell server Putty —— win 10 之间通过 ssh 登录
  15. jmeter-same user on each interation
  16. 微擎系统换服务器,微擎服务器迁移
  17. 京东区块链技术实践白皮书(附下载地址)
  18. 一文搞懂PMP挣值管理那些让你头疼的公式
  19. JVM相关命令查看GC情况
  20. 视数字人民币为假想敌——数字美元的来龙去脉

热门文章

  1. MY SQL 数据库升级
  2. php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...
  3. Java生鲜电商平台-订单架构实战
  4. IDEA 查找某个 jar 包是如何被引入的
  5. VMware虚拟机安装Ubuntu kylin 麒麟系统教程 超详细
  6. freemarker html 换行,java使用freemarker模板导出word,合并单元格,单元格内换行
  7. 【一级倒立摆】基于simulink的一级倒立摆控制器系统仿真
  8. 网络安全——Linux基础
  9. 计算机考试C1-1随笔
  10. 最长上升子序列(O(nlogn))算法并输出最长上升子序列