Composite(组成)---对象结构型模式

Composite使得用户对单个对象和组合对象的使用具有一致性。

Composite模式的关键是一个抽象类,它既可以代表图元,又可以代表图元的容器。

以下情况使用Composite模式:

1、想表示对象的部分-整体层次结构。

2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

用户使用Component类接口与组合结构的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

Composite模式定义了

1、包含基本对象和组合对象的类层次结构。基本对象可以被被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。

2、简化客户代码。客户可以一致地使用组合结构和单个对象。通常用户不知道(也不关心)处理的是一个叶节点还是一个组合组件。

3、使得更容易增加新类型的组件。新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作。

对于父部件引用,必须维护一个不变式,即用一个组合的所有子节点以这个组合为父节点,而反之该组合以这些节点为子节点。仅当在一个组合中增加或删除一个组件时,才改变这个组件的父部件。如果能在Composite类的Add和Remove操作中实现这种方法,那么所有的子类都可以继承这个方法,并且将自动维护这一不变式。

最大化Component接口。Composite模式的目的之一是使得用户不知道他噶们正在使用的具体Leaf和Composite类。为了达到这一目的,Composite类应为Leaf和Composite类尽可能多定义一些公共操作。Composite类通常为这些操作提供缺省的实现,而Leaf和Composite子类可以对它们进行重定义。但这个目标有时候可能与类层次结构设计原则相冲突,该原则规定:一个类只能定义那些对它的子类有意义的操作。例如,访问子节点的接口是Composite类的一个基本组成部分,但对Leaf类来说并不必要。但是如果我们把一个Leaf看成是一个没有子节点的Component,就可以为在Component类中定义一个缺省的操作,用于对子节点进行访问,这个缺省的操作不返回任何一个子节点。Leaf类可以使用缺省的实现,而Composite类则会重新实现这个操作以返回它们的子类。

Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,它们通常有一个公共的父类。

Flyweight模式让你共享组件,但不再能引用它们的父部件。

Iterator模式可用来遍历Composite。

Visitor模式将本来应该分布在Composite和Leaf类中的操作和行为局部化。

猜你喜欢

转载自linshiquan.iteye.com/blog/1036073
今日推荐