组合模式

来源:互联网 发布:ansys软件 编辑:程序博客网 时间:2024/06/08 07:17

概念

组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合.

组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象.使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别.


适用场景

1. 当有数个对象的集合,他们彼此之间又"整体/部分"的关系, 并且想用一致的方式对待这些对象时; 或满足其中之一即可


结构


抽象组件角色(component) 为组合中的对象声明接口, 在适当的情况下,实现所有类公有接口的默认行为. 声明一个接口用于访问和管理子部件; 这个接口可以用来管理所有的子对象. 同时可以在递归结构中定义一个接口,用于访问父部件, 并在合适的情况下实现它
 
叶节点角色(Leaf)在组合树种表示叶节点对象,叶节点没有子节点.
组合角色(Composite)定义有子部件的那些部件的行为.存储子部件, 实现Component接口有关子部件的操作
客户角色(Client)通过Component接口操纵组合部件的对象

组合,组件, 树?
组合包含组件.组件有两种:组合与叶节点元素.听起来比较像递归.组合持有一群孩子,这些孩子可以是别的组合或者叶节点元素.当你用这种方式组织数据的时候,最终会得到树形结构(正确的说法是自上而下的树形结构),根是一个组合,而组合的分支逐渐往下延伸,直到叶节点为止.


优缺点

优点

1.定义了包含基本对象和组合对象的类层次结构, 基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象
2. "用一致的方式对待"所有的对象, 这样可以达到简化客户代码的效果. 客户可以一致地使用组合结构和单个对象. 通过牺牲单一责任原则换取透明性, 即通常用户不知道 (也不关心)处理的是一个叶节点还是一个组合组件. 这就简化了客户代码 , 因为在定义组合的那些类中不需要写一些充斥着选择语句的函数
3. 使得更容易增加新类型的组件 新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变
4. 有时候这个组合结构很复杂,或者遍历代价太高,那么实现组合节点的缓存(caching)就很有帮助.比方说,如果你要不断的遍历一个组合,而且它的每一个子节点都需要进行某些计算,那你就应该用缓存来临时保存结果, 省去遍历的开支.

缺点

1. 在单一责任原则和透明性上做了折中, 导致一些对象有冗余/无意义的接口
2. 意味着每一个对象都有相同的接口, 如果组合中有些对象的行为不太一样, 那么就要根据对象的类型进行不同的方法调用, 这样又失去了透明性.
3. 使你的设计变得更加一般化 容易增加新组件也会产生一些问题,那就是很难限制组合中的组件. 有时你希望一个组合只能有某些特定的组件. 使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查




原创粉丝点击