组合模式又称合成模式,国外设计模式大师GOF把合成模式定义为:“将对象组合成树形结构以表示” 部分-整体的 层次结构
“将对象组合成树形结构以表示” 部分-整体的 层次结构可以理解为“通过树形结构,同等显示多个独立的对象以及他们复合而成的合成对象”
1.结构

Component:为组合中的对象声明接口。在适当的情况下,嘻嘻所有类共有接口的缺省行为,声明一个接口用户访问和管理Component的只组件。在递归结构中定义一个接口(可选),用户访问一个父部件并在合适的情况下实现它
Leaf:在组合中表示叶借点对象,叶子点没有子节点对,在组合定义图元对的行为
CompZ??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc2l0ZTq2qNLl09DX07K/vP61xMTH0Kmyv7z+tcTQ0M6qLLTmtKLX07K/vP4s1NpDb21wb25lbnS907/a1tDKtc/W0+vX07K/vP7T0LnYtcSy2df3PC9wPgo8cD5DbGllbnQ6zai5/UNvbXBvbmVudL3Tv9qy2dfd1+m6z7K/vP61xLbUz/M8L3A+CjxwPjxzdHJvbmc+Mi7KtcD9PC9zdHJvbmc+PC9wPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/49/1_gnndr__.png" alt="\">
人事管理系统是Componet
员工原理包括 员工列表、新增员工、修改员工、员工资料上传、员工查询 子菜单(即没有内部树结构),因此,它只是一种树叶节点(即leaf)
以上树节点和树叶根据相同的地位共同组合人事管理系统,这就是组合模式在实际软件开发中的一个现实案例
应用优势与时机
组合具备以下一些优势
1.树型结构抑郁增加组合对象
2.无论分层对象是否复杂,均可清晰定义,并且可方便的添加新的构件
3.客户端可简便的共同调用组合或单个对象
应用场景
当开发树形结构系统时
当客户要求软件需要展现全局与个体关系时
当系统需要共同使用组合结构的全体对象时
示例

package model.composite;
/*
* 排级单位抽象类
* 定义一个军队排级单位的抽象类-即Component
*/
public abstract class Group {
private String name = "";//姓名
private String post = "";//官职
private String no = "";//编号
private Group parent = null;
//实际软件项目中构造函数的定义
public Group(String name, String post, String no) {
super();
this.name = name;
this.post = post;
this.no = no;
}
//获取军官信息
public String getMessage(){
String message ="";
message ="姓名:"+this.name;
message = message + "\t官职:"+this.post;
message = message + "\t编号:"+this.no;
return message;
}
//获取父节点
public Group getParent() {
return parent;
}
//设置父节点
public void setParent(Group parent) {
this.parent = parent;
}
}
package model.composite;
/*
* 叶子类
* 班长-无下属军官的军官-Leaf
*/
public class Monitor extends Group{
public Monitor(String name, String post, String no) {
super(name, post, no);
}
}
package model.composite;
import java.util.ArrayList;
/*
* 节点类
*/
public class Node extends Group {
//构造函数的定义
public Node(String name, String post, String no) {
super(name, post, no);
}
//上机军官下属包括哪些下级军官和下下级军官
ArrayList
juniorList = new ArrayList
(); //增加一个下属,可能是下级军官,也可能是个下下级军官 public void addJunior(Group group){ group.setParent(this); juniorList.add(group); } //上级拥有的下属 public ArrayList
getJunior(){ return this.juniorList; } } package model.composite; import java.util.ArrayList; /* * 客户端测试类 * 展现属树型结构: * 一级节点是排长platoonOfficer ,二级节点是副排长platoonSergeant,三级节点是班长monitor */ public class ClientCase { /* * 实现树型结构 */ public static Node CompositeNodeTree(){ //一级节点 Node node = new Node("杰克", "排长", "A0001"); //二级节点:二个副排长 Node platoonSergeant1 = new Node("李东", "副排长", "A0002"); Node platoonSergeant2 = new Node("将飞", "副排长", "A0003"); //三级节点:班长 Monitor a0002_1 = new Monitor("陈小小", "班长", "A0002_1"); Monitor a0002_2 = new Monitor("李梅", "班长", "A0002_2"); Monitor a0002_3 = new Monitor("师徒青云", "班长", "A0002_3"); Monitor a0003_1 = new Monitor("金宏", "班长", "A0003_1"); Monitor a0003_2 = new Monitor("马晓宇", "班长", "A0003_2"); Monitor a0003_3 = new Monitor("林东桥", "班长", "A0003_3"); //设置下级----------------- //排长下属二个副排长 node.addJunior(platoonSergeant1); node.addJunior(platoonSergeant2); //两个副排长下的下属 platoonSergeant1.addJunior(a0002_1); platoonSergeant1.addJunior(a0002_2); platoonSergeant1.addJuni