设计模式-composite

来源:互联网 发布:机顶盒网络灯红色 编辑:程序博客网 时间:2024/04/29 17:20

1.概述

这个设计模式有点像数据结构中的树。分别有叶子节点可非叶子节点,叶子节点没有子节点,而非叶子节点有子节点,非叶子节点又可以是别的非叶子节点的子节点。

2.问题

有一个对象,他是由其他的部件组成,这些部件又由很多其他的零件组成,形成了一个部分-整体的结构,这是一种类似于树的结构,整体又可以去构成其他整体,就像非叶子节点。我们可以把这些由很多其他零件组成的部件定义为容器,零件定义为单个的对象,但是这样用户得区分容器和部件的用法。但是实际上,这些部件在客户看来是一样的,这些东西如果区别使用,那么代码就将变得很复杂,所以我们想一种办法,使得用户不必区分部件和对象。

3.问题解决

设计模式中的composite模式,就是用来解决部分和整体使用不一致矛盾的。比如在一个树,不区分叶子节点和非叶子节点了。大家经常使用的文件目录就是用这种方式构造的。叶子节点就是我们的每一个文件,而非叶子节点就是我们的文件夹。

4.composi模式的角色

component 接口定义了所有节点的方法,并默认了叶子节点没有的方法为空方法(即管理子节点的方法)。

composite 这个定义了管理子节点的方法。

leaf 节点,这就是叶子节点。


说明:对于很多访问子节点的方法,如何防止没注意被leaf调用呢,那就是定义一个getComposite方法,默认为空,而composite对其进行实现。


5。适用性:

1)如果你想表示整体-部分结构

2)如果你想让client忽略整体和部分的使用区别。

这就是composite的结构。

使用的好处

1)定义了包含基本对象和组合对象的类层次结构 基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到   基本对象的地方都可以使用组合对象。
2) 简化客户代码 客户可以一致地使用组合结构和单个对象。通常用户不知道 (也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码 , 因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。
3) 使得更容易增加新类型的组件 新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变。

4) 使你的设计变得更加一般化 容易增加新组件也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。


1 0
原创粉丝点击