组合模式

介绍

组合模式(Composite Pattern) 也称为部分-整体模式(Part-Whole Pattern) 结构型设计模式之一

组合模式将一组相似的对象看作一个对象处理,并根据一个树状接口来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别。

组合模式中将一个拥有分支的节点称之为枝干节点,位于树状结构顶部的枝干结构比较特殊,我们称为根结构件,没有分支的结构,称之为叶子构件

定义

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

使用场景

  • 表示对象的部分-整体层次结构时
  • 从一个整体中能够独立出部分模块或功能的场景

角色介绍

  • Component 抽象根节点,为组合中对象声明接口,适当情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理 Component 的子节点,可在递归结构中定义一个接口,用于访问一个父节点,并在合适的情况下实现它。

  • Composite 具体枝干节点,定义有子节点的那些枝干节点的行为,存储子节点,实现 Component 接口中定义的方法

  • Left 在组合中表示叶子节点对象,叶子节点没有子节点,在组合中定义节点对象的行为

  • Client 通过 Component 接口操纵组合节点的对象

将组合所使用的的方法定义在抽象类的方式称为透明的组合模式,而上面所说的组合模式称为安全的组合模式,透明组合模式中不管是叶子节点还是枝干节点都有着相同的结构,那意味着我们无法通过 getChilder 方法得到子节点的类型(安全的组合模式中叶子节点没有 getchilder 方法),而必须通过内部进行判断

实例

文件夹的管理,文件夹中可以存在文件夹和文件,抽象为组合模式

Android 开发中,目录选择器 DirSelector 会使用到组合模式

Android 源码中的组合模式

View 和 ViewGroup 的嵌套组合就是安全的组合模式,只有 ViewGroup 才可以嵌套 View。

总结

Android 开发过程中组合模式适用于对一些界面 UI 的架构设计上。这部分代码绝大多数情况会由程序语言提供。

优点

  • 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让高层模块忽略了层次的差异,方便对整个层次结构进行控制。

  • 高层模块可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了高层模块的代码

  • 在组合模式中增加新的枝干构件和叶子构件都很方便,无须对现有的类库进行任何修改,符号“开闭原则”

  • 组合模式为树形结构的面向对象实例提供了一种灵活的解决方案,通过叶子对象和枝干对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单

缺点

在新增构件时不好对枝干中的构件类型进行限制,不能依赖类型系统来施加约束,因为在大多数情况下,它们都来自于相同的抽象层,此时,必须在运行时进行类型检查来实现,这个实现过程比较复杂。

你可能感兴趣的:(组合模式)