今天,我们来分享结构型模式的另外一个成员:组合模式。
组合模式是一种结构型模式,它允许将对象组合成树形结构,以表示部分-整体的层次关系。组合模式允许客户端以统一的方式处理单个对象和对象的集合,而无需了解对象之间的具体差异。
层次结构的场景其实在我们日常生活上、工作中经常遇到。在开始本文介绍之前,我们先来感受一下比较典型的几个树形结构:
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个属性:
Leaf角色
定义几个简单的验证器,包括,不为空的验证器和字符串少于长度的验证器。
Composite角色
定义一个组合验证器的抽象验证器,包含一个验证器列表,以及对验证器列表进行添加和删除的方法,如:
定义一个AND的组合验证器
只要有一个条件不满足就判定校验失败。
定义一个OR的组合验证器
只要一个条件满足就判定校验通过。
Client角色
客户端实现多种场景的验证器判断,包括:
输出结果
我们可以看到,无论怎么组合,只要执行验证器的validate()方法即可。
优点
缺点:
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。