一. 定义
将对象组合成束状结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
二. 类图
2.1 安全模式
- Component抽象构件角色,定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。
- Leaf叶子构件:叶子对象,遍历的最小单位
- Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子结点形成一个树形结构。
2.2 透明模式
- 透明模式是把原来用来组合使用的方法放到抽象类中,比如add()、remove()以及getChildren()等方法(getChildren一般返回的结果是Itreable的实现类)。
- 透明模式中判断getChildren的返回值来确认是叶子结点还是树枝节点,如果处理不当,这个会在运行期出现问题。安全模式下,它是把树枝节点和叶子结点彻底分开,树枝节点单独拥有组合的方法,这种方法比较安全。
- 透明模式遵循来依赖倒置原则,方便系统进行扩展。
三.优点
- 高层模块调用简单。一棵树中所有节点都是Component,局部和整体对调用者来说没有任何区别。
- 节点自由增加,扩展性强。
四.缺点
- 与依赖倒置原则冲突,会限制接口的影响范围
五.使用场景
- 维护和展示部分-整体关系的场景,如树形菜单 文件和文件夹管理。
- 从一个整体中能独立出部分模块或功能的场景。
六.注意事项
- 只要是树形结构,就要考虑使用组合模式。
- 组合模式默认遍历模式是从根到叶子结点,如果遍历模式要从叶子结点到根,需要加一个Parent属性,如下图: