前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫谈模式之组合模式

漫谈模式之组合模式

作者头像
孟君
发布2023-03-17 07:48:42
4140
发布2023-03-17 07:48:42
举报
文章被收录于专栏:孟君的编程札记

今天,我们来分享结构型模式的另外一个成员:组合模式

组合模式是一种结构型模式,它允许将对象组合成树形结构,以表示部分-整体的层次关系。组合模式允许客户端以统一的方式处理单个对象和对象的集合,而无需了解对象之间的具体差异。

层次结构的场景其实在我们日常生活上、工作中经常遇到。在开始本文介绍之前,我们先来感受一下比较典型的几个树形结构:

1、文件&目录

比如文件和目录,目录下又可以包含目录和文件。

我们去操作删除操作,其实只要指定路径即可。删除目录和删除某个文件的操作,对我们来讲只要调用一个delete()方法接口。

图片
图片

2、测试计划、工具和Case

比如测试计划,可以包含多个TestSuite,TestSuite下可以包含一个或者多个TestCase。TestSuite下也可以包含子TestSuite。

比如,我们要跑测试计划,操作一个TestCase、一个TestSuite或者TestSuite组合都是一样的操作。

图片
图片

构件

如果对java AWT / Swing GUI框架有了解的小伙伴,可以知道构件之间可以组合。比如一个Frame可以包含多个JPanel,JPanel可以嵌套JPanel,JPanel上又可以放Button、Label等。

图片
图片

这里就是使用了组合模式来实现GUI组件的管理的。接下来,我们就来对组合模式进行介绍并给出相关的示例。

组合模式介绍

意图

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

结构

组合模式的基本结构如下:

图片
图片

这里涉及到的参与者有如下几种:

Component角色

这是一抽象角色,它给参加组合的对象规定一个接口,规范共有的接口及默认行为。

Leaf角色

在组合中表示叶节点对象,叶子节点没有子节点。

Composite角色

代表参加组合的有子对象的对象,定义出这样的对象的行为。

Client角色

通过Component接口操纵组件的对象

参与者如何协作?

用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶子节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

组合模式示例

我们来展示2个示例,包括:

  • 任务组合
  • 多校验组合

1、任务组合示例

其实在很多场景下都有单个任务或者多个任务组合来完成执行的情况,比如在不同行业下,调用不同的接口完成不同场景下的指标运算。

下面,我们简单来介绍一下任务组合使用组合模式完成的简单示例。

抽象角色

定义一个任务执行的接口,

图片
图片

并给出一个包含名字的抽象任务。

图片
图片

叶子角色

定义4个小任务,包括A、B、C和D。

图片
图片

Composite角色

定义一个任务组合,包含一个列表List<TaskAction> tasks, 拥有增加和删除任务的方法,因为有列表存储,支持多个任务的执行。

图片
图片

Client角色

客户端实现多种场景的任务执行,包括:

  • 单个任务执行
  • 单个任务分组执行
  • 任务分组包含分组和单个任务混搭执行
图片
图片

输出结果

图片
图片

我们可以看到,执行单个任务或者执行任务分组或者不同组合,都只要执行xxx.execute()就能完成所有任务的执行。

2、多校验组合示例

再来给一个示例,用于单个的验证器以及组合的验证器。

Component角色

定义一个拥有validate()的接口,并定义一个抽象类,包含3个属性:

  • value - 需要验证的对象的值
  • desc -  value对应的名称,如名字
  • name - 给一个验证器的名称
图片
图片

Leaf角色

定义几个简单的验证器,包括,不为空的验证器字符串少于长度的验证器

图片
图片
图片
图片

Composite角色

定义一个组合验证器的抽象验证器,包含一个验证器列表,以及对验证器列表进行添加和删除的方法,如:

图片
图片

定义一个AND的组合验证器

只要有一个条件不满足就判定校验失败。

图片
图片

定义一个OR的组合验证器

只要一个条件满足就判定校验通过。

图片
图片

Client角色

客户端实现多种场景的验证器判断,包括:

  • 单个验证
  • AND组合验证
  • AND和OR的组合器验证

图片
图片

输出结果

图片
图片

我们可以看到,无论怎么组合,只要执行验证器的validate()方法即可。

小结

优点

  • 组合模式可以很容易地增加新种类的构件。例如,可以轻松地添加新的子节点或删除现有的子节点,而不会对整个系统造成太大的影响。
  • 使用组合模式可以使客户端变得容易设计,因为客户端不需要知道构件是树叶构件还是树枝构件。

缺点:

  • 使用组合模式后,控制树枝构件的类型就不太容易
  • 用继承的方法来增加新的行为会变得困难

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组合模式介绍
  • 组合模式示例
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档