设计模式15之组合模式

背景

首先我们来理解下"部分-整体",在现实生活中的这种关系"部分-整体"也很常见。比如:学院与学校,分公司与总公司,书与书柜等等。

在软件开发中我们常常有对简单对象与复合对象的处理,可以使用组合模式一致地处理单个对象与复合对象,客户端无需关系要调用的是单个对象还是复合对象。这种通用性很好的减少了客户端的代码。

上面的介绍是不是比较抽象?别急,请继续往下看。

什么是组合模式

Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.(将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性。)

组合模式主要有3个要素构成:

  • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。

  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。

  • 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

组合模式结构简图如下。

组合模式

代码实现

Component

Leaf

Composite

测试代码:

这个测试代码是干什么事情的呢?我们用来遍历Leaf中的内容的。

遍历

测试结果如下:

树叶Lvshen1:被访问!
树叶Lvshen2:被访问!
树叶Lvshen3:被访问!

关于组合模式的思考

关于上述代码Leaf就是单个对象,Composite就是复合对象。对客户端来说,调用的是Component,整体和局部没有任何区别。Composite既能装载自己也能装载Leaf,只需要一套代码就能满足。

使用了组合模式后,我们可以看到,如果想增加一个树枝(Composite)节点、树叶(Leaf)节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

那么我们什么情况使用它呢?

在开发中我们如果有需要展示"局部-整体"的场景,例如树形菜单、文件与文件夹管理等等都可以使用组合模式。

还有如果你需要开发管理系统,可能涉及到人员职级关系图的开发。比如总经理-部门经理-员工这样的树形结构。

还有电商分销系统中,需要展示上线与下线关系。也可以使用组合模式。

 

往期推荐

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

  1. 回复"java" 获取java电子书;

  2. 回复"python"获取python电子书;

  3. 回复"算法"获取算法电子书;

  4. 回复"大数据"获取大数据电子书;

  5. 回复"spring"获取SpringBoot的学习视频。

  6. 回复"面试"获取一线大厂面试资料

  7. 回复"进阶之路"获取Java进阶之路的思维导图

  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

  9. 回复"总结"获取Java后端面试经验总结PDF版

  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值