什么是组合模式(Composite)

概念

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

组合模式关注的是对象间的结构,希望能够让调用者在使用一组对象时和使用单个对象没什么区别,屏蔽掉组合对象和单个对象的差别

个人感觉组合模式应该叫做树形模式,当对象呈现成树形结构时,使用这个模式就非常的好了,建议改名。

组合模式分为两种:透明式组合模式和安全式组合模式。

透明式组合模式:所有的对象都是使用同一个接口,不会区分对象之间的差别,使用者使用起来是区分不了的。树叶构件也会实现树枝构件的方法,但是是空实现,需要抛出异常。

安全式组合模式:树叶构件和树枝构件的接口需要区分开来,在实际使用时需要使用者区分构件,对于使用者来说就失去了透明性,但也不会在调用方法时抛出异常。

优点

  1. 使用简单,开发过程也简单。使用者不需要关心整体和单个对象的区别。
  2. 清晰地划分了对象的职责。
  3. 符合开放封闭原则。想要加新的对象,只需要实现统一的接口即可,不需要修改已有的代码。

缺点

  1. 有一定的设计难度。需要理清对象间的层级关系,才能够设计出相应的类。
  2. 随着对象的种类越来越多,整体的结构会变得复杂。

原则

“+”代表遵守,“-”代表不遵守或者不相关

原则 开放封闭 单一职责 迪米特 里氏替换 依赖倒置 接口隔离 合成复用
+ + - - + - +

适用场景(动机)

  1. 希望整体对象和单个对象间在使用上没有差别。
  2. 希望整体对象呈现树形结构

具体的一些使用场景:菜单、文件夹。

如何实现

想要实现组合模式,需要有以下三样东西:

  1. 抽象构件(接口/抽象类):作为声明树叶构件和树枝构件的公共接口,定义树叶和树枝的默认行为。如果是安全式组合模式的话就需要有两个抽象接口。
  2. 树叶构件:需要实现抽象构件,树叶构件没有子节点。
  3. 树枝构件:需要实现抽象构件,树枝构件有子节点,负责存储和管理子节点。

下面举例在学校中的统计人数,一个学校需要统计人数,就会把任务交给每个年级的年级主任,年级主任再向班长去要人数,最后就有班长来统计人数,然后年级主任再相加,再交给上级。

从这里我们也可以看出这是一个树型的结构,在具体的使用中也会用到递归。

上类图

才想起来IDEA可以写完代码后就可以查看类之间的关系了,亏我之前还自己去画类图,所以我现在已经写完代码了,来粘上我的代码。

上代码

抽象构件:Component

/**** 抽象构件* Created on 2021/6/1.** @author xuxiaobai*/
public interface Component {int sum();
}

树枝构件:Composite

/*** 年级主任* 树枝构件* Created on 2021/6/1.** @author xuxiaobai*/
public class Composite implements Component{/**年级班长的集合* 这里建议使用声明的公共接口,这样就能够添加多种对象* 需要指定特俗的对象时,可以使用对象作为声明*/List<Component> leafs=new ArrayList<>();//加入新的班长public void add(Component component){leafs.add(component);}/*** 统计总人数* @return*/@Overridepublic int sum() {int sum=0;for (Component leaf : leafs) {sum+=leaf.sum();}return sum;}
}

树叶构件:Leaf

/*** 班长* 树叶构件* Created on 2021/6/1.** @author xuxiaobai*/
public class Leaf implements Component {private int num;public Leaf(int num){this.num=num;}@Overridepublic int sum() {return num;}
}

测试类:

/*** 组合模式测试类* Created on 2021/6/1.** @author xuxiaobai*/
public class CompositeTest {public static void main(String[] args) {Composite composite = new Composite();composite.add(new Leaf(20));composite.add(new Leaf(30));composite.add(new Leaf(40));System.out.println("该年级人数:");System.out.println(composite.sum());/*** 输出结果:* 该年级人数:* 90*/}
}

因为这里的年级主任(树枝构件)和班长(树叶构件)做的事情都是一样的,所有就不存在安全式和透明式一说,如果在多加一些功能,就需要区分出来了。

总结

组合模式,又名树形模式,基本上遵守了七大设计原则,是一个非常优秀的设计模式,特别适用于当组合对象呈现出树形结构的情况,在具体实现中的树枝构件和树叶构件可以有多种多样,可以让整个组合对象呈现出非常复杂的结构。但要使用组合模式,需要一定设计经验和能力,理清对象间的层级关系

【设计模式】组合模式?建议改名叫树形模式!相关推荐

  1. 联通光猫由网关模式,改为桥接模式。

    联通光猫由网关模式,改为桥接模式. 用管理员进入光猫,192.168.1.1/cu.html,管理员密码是CUAdmin+8位数字 比如CUAdmin12345678 1协议由ipv4改成Ipv4/i ...

  2. word只读模式怎么改成编辑模式

    Word只读文档改成可编辑文档有在关闭只读属性.停止审阅保护.插入文档等多个不同的修改方法, 以下为在关闭只读属性改为可编辑文档的具体操作步骤: 方法一: 右键选择word文件,选择[属性],在属性中 ...

  3. 硬盘分区模式gpt改成mbr模式_系统硬盘gpt转换的操作方法

    gpt分区因为其可以的支持更加大容量的硬盘,以其优越性将会在未来取代mbr,但是目前安装系统仍受硬盘分区模式的局限,win7用户只能用mbr装,DiskGenius为了方便升级win8或win10的时 ...

  4. 设计模式 -- 组合模式(Composite)

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识组合 ...

  5. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  6. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  7. 设计模式C++实现(7)——外观模式、组合模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  8. java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的:html 合成模式属于对象的结构模式,有时又叫作"部分--总体"模式.合成模式将对象 ...

  9. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式

    第十六章:无尽加班何时休--状态模式 状态模式 :   优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...

最新文章

  1. c语言如何持续输入字符直到指定字符结束_《小白学C》第三章 常用输入输出函数...
  2. ExtJS 表单 submit时错误处理
  3. cisco 路由器访问权限的设置
  4. 最长不重复字符串python_Python简单实现查找一个字符串中最长不重复子串的方法...
  5. 不断学习UI框架的写法
  6. 2018/8/31周报
  7. YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
  8. python 迭代器相关知识
  9. 统一并发 II——基准测试方法
  10. Tokenview:交易所比特币净流出量大幅增加
  11. [NOI2019]序列
  12. Apache Hudi 是Uber 大数据存储系统
  13. Spring核心之一:Spring的配置文件是干什么的
  14. oracle导出pck文件,Oracle sqlloader自动化导入迁移工具—可批量生成千万控制文件与批处理文件|一键执行(推荐)...
  15. C++入门基础之计算使用某快递公司运输货物的运费
  16. 驾培行业现状改革创新探索互联网+品牌服务模式
  17. 双因素认证令牌_安全令牌:防止双因素令牌认证攻击
  18. Flutter 实现风车加载动画组件
  19. Clarifai的AI可检测图像和视频中的不合规内容
  20. Python界面编程第二课:Pyside2 创建窗口 (Python GUI)

热门文章

  1. 【学习方法】使用正确的学习方法
  2. 【C++】判断亲和数
  3. 在 windows 上使用 gousb 开发 usb
  4. 腾讯云短信服务实现短信验证功能
  5. 关于时区的时间的详解,比如UTC\GMT等
  6. 常见光影效果常见光影效果常见光影效果
  7. 错误: Failed to introspect Class [com.baomidou.mybatisplus.autoconfiguration] from ClassLoader
  8. iOS 应用中调用系统写邮件
  9. 计算机论文网络教学,网络教学下计算机教育论文
  10. 平价好用的蓝牙耳机有什么推荐?适合元旦送人蓝牙耳机分享