组合模式
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。 ——《Head First 设计模式》 也就是说,组合模式是用来呈现树状结构的,利用组合模式,让叶子节点和非叶子节点继承同一个基础类,可以让叶子节点对象和组件(非叶子)节点对象之间的差异得以忽略,从而为客户进程提供更简单统一的调用方式。 类图 从类图中可以看出,组件(非叶子节点)既继承了基础类,也拥有基础类作为一个属性。继承基础类是为了和叶子节点有同一个基础类,从而对客户端屏蔽组件和叶子节点的差异,让客户端有统一接口可以调用,方便客户端进程。拥有基础类作为一个属性是因为组件类不是叶子节点,其叶子节点的数据放在这个属性中。 例子 此处以部门为例子进行说明。假设A部门底下有B、C、D三个部门,C部门底下有E、F部门,B、D、E、F部门都没有子部门。部门之间的层次结构如下图所示 类图 抽象基础类 抽象类Dept中有一个抽象函数description,用于描述本部门的信息。另外三个函数add、remove、getChild在抽象基础类中提供默认实现,主要是考虑到叶子类的情况,这样叶子类继承后只需要实现description函数即可。而非叶子类需要重写这四个函数。因为add、remove、getChild这三个函数对非叶子类有意义而对叶子类无意义。 当然,对于add