组合模式主要应用在“树形结构”的情况下,如 GUI各控件、目录树等。
在有些设计模式的书里把组合模式定义为两种,即安全的组合模式和透明的组合模式。个人感觉只有“透明的组合模式”才是真正的模式,安全的组合模式不能称为模式。
对于“安全的组合模式”这里不做讨论,它只是一种普通的面向对象应用而已,没有什么特别之处。
上图所示为一个组合模式的框图,在这里最需要注意的一点就是 Leaf和Composite具有相同的接口(或抽像类)Component,无论是 Leaf 还是 Composite,对于其它类看来它只是一个 Component,既然它是一个 Component它就应该具有 Component 的方法。
一个组合模式的最顶层接点应该是具有孩子的结点,那么当最顶层的接点调用 operation 方法时,它会依次调用自己孩子的 operation, 而顶层接点的孩子如果还有孩子,它又会调用孩子的operation, 就这样递归下去,一直到叶子接点,叶子接点没有孩子,存储孩子的 ArrayList 为空,所以递归终止。