Composite模式

Design Pattern: Composite 模式
 

 来源:riabook.cn

 

如何在一个统一的类图中同时表达继承和包含这两种逻辑关系饿?Comosite模式

 

1 设计意图

 当一个系统中的对象需要组合成树形结构,以表示整体和部分的层次关系时,就可以使用Composite模式;

Composite模式的设计意图:

(1) 把对象组成成树形结构

(2) 通过继承树,使客户程序以透明的和统一的方式,访问继承树中的所有类的对象实例。对于客户来说,Composite模式中简单的被聚合对象和尅聚合其他对象的复合对象之间,并没有什么区别。

 

2.  基本结构

如果以绘图为例的话,一个文字是一个绘图元件,一个线段是一个绘图元件,而一个长方形也是一个绘图元件,这些绘图元件可以组成一个图片,如果将这个图片也视作一个绘图元件,则这么递回绘图下去,就可以组合成一个较大的、复杂的图形元件,这样的目的可以使用Composite模式来解决。

对于使用者而言,无论是文字、线段或长方形,甚至是组合后的图片元件,它们都拥有一个共同的行为,使用者基本上并不会感觉出它们之间的操作有任何的不同,您可以拖曳、放大、缩小等等,这些行为都是一致的。

以 UML 来表示上面这个例子的结构:

Composite模式_第1张图片
图 2.1

对于Text、Line与Rectangle而言,Picture是一个容器,然而Picture继承Graphic类,所以它也是一个绘图元件,您可以进一步的将Picture组合至另一个Picture中,以形成较大的、复杂的图形。

组合模式的UML结构图如下所示:

Composite模式_第2张图片
图 2.2

依此架构,您可以递回的组合图形元件,例如:
 

Composite模式_第3张图片
图 2.3

除了绘图元件之外,一些具有层次性或组合性的物件也可以使用Composite模式,像是电路元件、设备元件等等,使用Composite模式可以大大减低这些元件设计的复杂度。

 

3、Composit模式使用权衡

透明和安全是使用Composite模式需要着重考虑的两个问题;

3.1 透明的Composite模式:

       在透明的Composite模式中,为了使客户能透明的访问所有对象,抽象类Component中必须定义所有派生类需要的方法,既包括Add(), Remove()等好聚合关系相关的方法,也要包括简单对象和复合对象共有的方法。对于类的数量较少的继承树,这是一个不错的设计方案,但是,当继承树上的类很多时,这种方案就会因为职责分配不够清晰,而造成系统的质量隐患。

3.2 安全的Composite模式

      客户通过每一个具体的派生类接口执行相关操作,而不是统一执行抽象类的接口。

      这种模式,常要使用向下转型的方式操纵具体的派生类接口。

 

4. Composite模式的变异:兼顾透明和安全的Composite模式

                                                                               Composite模式_第4张图片

(1) 把Component类中的聚合相关的方法下移到Composite中

(2) 具体的复合对象继承于Composite类,简单对象继承于Leaf类

这样一来,对抽象类Composite转型成复合类就相对安全;把树形分成两类,简单对象从Leaf派生,复合对象从Composite派生,Comosite类可以聚合简单对象,简单对象不能聚合复合对象。

 


Design Pattern: Composite 模式
 

2009-09-17 来源:riabook.cn

 

如果以绘图为例的话,一个文字是一个绘图元件,一个线段是一个绘图元件,而一个长方形也是一个绘图元件,这些绘图元件可以组成一个图片,如果将这个图片也视作一个绘图元件,则这么递回绘图下去,就可以组合成一个较大的、复杂的图形元件,这样的目的可以使用Composite模式来解决。

对于使用者而言,无论是文字、线段或长方形,甚至是组合后的图片元件,它们都拥有一个共同的行为,使用者基本上并不会感觉出它们之间的操作有任何的不同,您可以拖曳、放大、缩小等等,这些行为都是一致的。

以 UML 来表示上面这个例子的结构:

Composite模式_第5张图片

对于Text、Line与Rectangle而言,Picture是一个容器,然而Picture继承Graphic类,所以它也是一个绘图元件,您可以进一步的将Picture组合至另一个Picture中,以形成较大的、复杂的图形。

组合模式的UML结构图如下所示:

Composite模式_第6张图片

依此架构,您可以递回的组合图形元件,例如: 

Composite模式_第7张图片

除了绘图元件之外,一些具有层次性或组合性的物件也可以使用Composite模式,像是电路元件、设备元件等等,使用Composite模式可以大大减低这些元件设计的复杂度。

m

你可能感兴趣的:(设计模式)