什么是组合模式(Composite)
组合模式属于结构型模式,它适用于对象层次为树形结构的类组合。
组合模式使得用户对单个对象和组合对象的访问和操作具有一致性,即组合模式中,客户能以一致性的方式去处理单个对象和组合对象。
UML图

首先顶层应该是一个Component部分类,抽象类,接口,它是什么都行。我们现在假定它是一个接口,这个Component中定义了一些操作方法operation1,operation2等等。这些操作方法的定义其实是希望用户能够以一致性的方式去处理单个对象和组合对象,因为后面单个对象和组合对象都会实现或者继承这个Component。Component中还定义了add方法,接受的参数是Component意思就是在实现Component接口或者抽象类的类中会包含一个Component的容器(可能是list,set,map等等),对于这个容器的操作还有get或者remove方法也在这个Component接口中定义了。
我们可以肯定的是,组合对象需要实现Component中定义的对于装有Component的容器的增删获取等操作。而叶子节点因为底下不再包含Component类了,所以叶子节点只需要实现Component中定义的需要对单个对象和组合对象进行一致性处理的操作方法。
组合模式代码示例
首先我们有一个学校,学校里面有许多学院,学院下面又有很多专业。
我们现在需要打印出整个学校下面所有的学院和专业,我们就可以使用组合模式。
组合模式特别适用于一些树形的类结构
Component
1 | public abstract class OrganizationComponent { |
组合对象Composite(这里是University和College)
1 | public class College extends OrganizationComponent { |
单个对象(叶子节点这里是Department)
1 | public class Department extends OrganizationComponent{ |
Client
1 | public class Client { |
实际运用
Tomcat的运用
在Tomcat中,四大容器Engine,Host,Context,Warpper都继承了Container接口,在Container接口中定义了对容器的增删等操作。
1 | public interface Container extends Lifecycle { |

上图是继承实现Container的类结构