意图:
将对象组合成树形结构以表示“部分-整体”的层次结构。
Composite使得用户对单个对象和组合对象的使用具有一致性。
适用性:
你想表示对象的部分-整体层次结构。
你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
(根据J道的理解,遇到树形结构的情形,就可以尝试是否使用组合模式。)
组合模式一般有两实现方式:安全性与透明性模式。它们是一对互为矛盾的要求。
透明性模式:
Component(分支结点)里面声明所有用来管理子类对象的方法。
目的就是为了使客户看来Leaf和Composite没有区别。
但这造成安全性问题。
安全性模式:
只在Composite里面声明所有的用来管理子类对象的方法。
这样就避免了安全性问题,
但是由于Leaf和Composite有不同的接口,所以又失去了透明性。
具体参见下面网页:
http://embed.chinaitlab.com/linux/845843.html
我的观点:
组合模式主要用来处理类似大礼包样子的对树形结构复杂对象。
例如,计算指定物品的重量、价格等;或对树形结构对象进行统一授权,统一修改外观等。
命令调用者不需要事先确定目标对象是一个简单个体还是一个复合体。