天天看点

组合模式(Composite)-结构型模式

我们在开发过程中经常使用到树形结构,它分为叶子节点和和分支节点两种,客户对象在使用这两种对象时候经常要对它们加以区别,增加了代码的复杂度,也非常容易出错。组合模式为这两种类型提供了统一的接口,可以让我们像操作叶子节点那样方便地操作分支节点。 

======================================================================================================================================

关于组合模式,GoF 给出的定义是:

Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.

将对象组合成树形结构来表现部分-整体的层次关系。组合使得客户一致地使用单个对象和组合对象。

要使客户程序对分支节点和叶子节点进行一样的操作,那么它们外形必须一样,即得有相同的接口隐藏具体实现,下面我们先从 UML 静态类图入手。 

组合模式(Composite)-结构型模式

======================================================================================================================================

安全的组合模式 

组合模式(Composite)-结构型模式

======================================================================================================================================

透明的组合模式 

组合模式(Composite)-结构型模式

======================================================================================================================================

安全的组合模式VS透明的组合模式

安全的组合模式编译时就可以发现为叶子节点执行add等无意义的管理子节点的操作,但造成了Leaf和 Composite接口不一致,损失了透明性。透明的组合模式只有在运行时才可能(如果不忽略的这些无意义调用的话)暴露错误地使用叶子节点的操作,牺牲了安全性,具有良好的透明性。这二者各有优缺点,读者在实际编程中需要自己权衡来决定应该使用哪种方式。

======================================================================================================================================

android中的例子

组合模式(Composite)-结构型模式

--------------以上摘自《漫谈设计式》+ http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121488.html

总结:

当我们需要处理的对象本身包含与自身属性相同的子对象时,我们就应该使用组合模式。如一个View 可以包含其他子View ,一个公司可以包含分公司,一个数组可以包含子数组,像这种类型的对象,形成了树形结构,我们定义统一的接口就可以方便地操作对象及对象组合。

继续阅读