组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。
Composite Pattern
Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
类图

模式的结构与使用
组合方法模式的结构中包括三种角色。
- 抽象组件(Abstract Component):是一个接口(抽象类),该接口(抽象类)定义了个体对象和组合对象需要实现的关于操作其子节点的方法,比如add()、remove()以及getChild()等方法。抽象组件也可以定义个体对象和组合对象用于操作其自身的方法,比如isLeaf()方法等。
- Composite(Composite Node):实现Component接口类的实例,Composite节点不仅实现Component接口,而且可以含有其他Composite节点或Leaf节点的引用。
- Leaf节点(Leaf Node):实现Component接口类的实例,Leaf节点实现Composite接口,不可以含有其他Composite节点或Leaf节点的引用,因此,叶节点在实现Component接口有关操作子节点的方法时,比如add()、remove()和getChild()方法,可让方法抛出一个异常,也可以实现为空操作。
简单的例子
Component的接口类MilitaryPerson.java
|
|
Composite的实现类MilitaryOfficer.java
|
|
Leaf的实现类MilitarySoldier.java
|
|
计算工资的工具类ComputerSalary.java
|
|
测试类Application.java
|
|
执行效果图

组合模式的优点
- 组合模式中包含个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象。
- 组合对象和个体对象实现了相同的接口,用户一般无须区分个体对象和组合对象。
- 当增加新的Composite节点和Leaf节点时,用户的重要代码不需要作出修改,例如,如果增加一个创建企业领导和一般职员的Composite节点和Leaf节点,那么ComputerSalary并不需要修改,就可以计算一个部门的薪水总和。
适用组合模式的情景
- 当想表示对象的部分-整体层次结构。
- 希望用户用一致的方式处理个体对象和组合对象。