加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

23种设计模式之组合模式

发布时间:2020-12-13 20:57:11 所属栏目:百科 来源:网络整理
导读:组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说,就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性,可

组合模式的定义

定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性.

通俗的说,就是实现了树形结构

通用类图如下:

23种设计模式之组合模式

其中的三个角色如下:

  1. Component 抽象构件角色: 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性
  2. Aggregate 树枝构件: 组合树枝节点和叶子节点形成一个树形结构
  3. Leaf 叶子构件: 其下再没有其的分支,是遍历的最小单位

抽象构件角色代码:

23种设计模式之组合模式

树枝构件代码:

23种设计模式之组合模式

叶子构件代码:

23种设计模式之组合模式

场景类代码:

23种设计模式之组合模式

组合模式的应用

组合模式的优点:

  1. 高层模块调用简单. 一棵树形机构中所有的节点都是 Component,局部和整体对调用者来说没有区别,高层模块不必关心自己处理的是单个对象还是组合结构,简化了高层模块的代码
  2. 节点自由增加. 如果想增加一个树枝节点、树叶节点,只要找到它的父节点就可以,非常容易扩展,符合开闭原则,对以后的维护非常有利

组合模式的缺点:

我们在使用的时候,树叶和树枝的定义直接使用了实现类,这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,限制了接口的影响范围

组合模式的使用场景:

  1. 维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理
  2. 从一个整体中能够独立出部分模块或功能的场景

只要是树形结构,就要考虑使用组合模式,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,应该考虑组合模式

组合模式的扩展

1.真实的组合模式

在上边的例子中,Clien 中进行了树的组装,而在实际项目中,数据通常在数据库中,我们直接从数据库将数据读取放到树上就可以了

2.透明的组合模式

组合模式有两种实现: 透明模式和安全模式. 上面的实现就是安全模式,透明模式的类图如下:

23种设计模式之组合模式

透明模式就是把用来组合使用的方法放到抽象类中,通过判断getChild() 的返回值确定是叶子节点还是树枝节点,在 Leaf 中实现 add等方法要抛出异常,如果处理不当,会在运行期出现问题

在透明模式下,遍历整个树形结构是比较容易的,不用进行强制类型转换.

透明模式的好处就是它基本遵循了依赖倒置原则,方便系统扩展

3.组合模式的遍历

有的时候不光要从上向下遍历,还要从下往上遍历,也就是通过子节点要找到他的父节点,这时就要在抽象构件角色中添加 getParent 方法,也就是在每个节点都增加一个父节点对象

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读