1.组合模式介绍
组合模式(Composite Pattern)也称为部分整体模式,是七大结构型设计模式之一。
组合模式将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象。如下图就很形象了,这类似于数据结构中的树结构就是组合模式。
2.组合模式的定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
3.组合模式的使用场景
表示对象的部分-整体层次结构时。
从一个整体中能够独立出部分模块或功能的场景。
4.组合模式的UML类图
UML类图5.角色介绍
Component:抽象根节点,为组合模式中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子节点。可以在递归结构中定义一个接口,用于访问一个父节点,并在合适的情况下实现它。
Composite:定义有子节点的那些枝干节点的行为,存储子节点,在Component接口中实现与子节点有关的操作。
Leaf:在组合中表示叶子节点对象,叶子节点没有子节点,在组合模式中定义节点对象的行为。
Client:客户端调用,通过Component接口操纵组合节点的对象。
6.模板
抽象根节点(上图) 具体枝干节点(上图) 具体叶子节点(上图) 透明抽象根节点(上图) 透明具体枝干节点(上图) 透明具体叶子节点(上图) 客户端调用(上图)7.例子
透明抽象根节点,文件和文件夹的抽象类(上图) 透明具体枝干节点,文件夹(上图) 透明具体叶子节点(上图)例子分析
例子是透明组合模式,文件夹是枝干节点,文件是叶子节点。文件类相对于文件夹类来说既不支持添加也不支持删除,它是文件系统中最小的分割单位,我们实现逻辑可以抛出一个不支持异常即可(例子中以打印日志说明不支持该操作为以及不做处理了)。
8.Android源码中的组合模式
Android源码中View和ViewGroup的嵌套组合是非常经典的组合模式。只有ViewGroup才能包含其他的View,比如LinearLayout能包含TextView,而TextView不能包含LinearLayout的。TextView直接继承于View,TextVie相当于具体的叶子节点,而LinearLayout相当于具体的枝干节点。ViewGroup相对于View只是多了几个对视图操作的方法。
9.总结
组合模式和解释器模式有一定的相似,它们在迭代对象时都涉及递归的调用,组合模式所提供的属性层次结构使得我们能够一视同仁对待单个对象和对象集合,不过是以牺牲类的单一原则换来的,而且组合模式是通过继承来实现的,缺少弹性。
优点:1.组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让高层模块忽略了层次的差异,方便对整个层次结构进行控制。
2.高层模块可以一致地使用一个组合结构或其追踪单个对象,不必关心处理的是单个对象还是整个组合结构,简化了高层模块的代码。
3.在组合模式中增加新的枝干构件和叶子构件都很方便,无需对现有类库进行任何修改,符合“开闭原则”。
4.组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和枝干对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制非常简单。
缺点:在新增构件时不好对枝干中的构件类型进行限制,不能依赖类型系统来施加这些约束,因为大多数情况下,它们都是来自于相同的抽象层。
PS:读《Android源码设计模式解析与实战》中的组合模式之后的一些笔记与感悟
网友评论