定义:
组合模式将对象组织到树结构中,可以用来描述整体和部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。
组合模式应用场景:
通常,我们用组合模式来设计树形结构,如树形菜单,目录结构等。在树形菜单中,分为有子节点的普通节点和无子节点的叶子节点。在模式中,父节点和子节点都实现同一个抽象接口,说明子节点和父节点同质。可以把父节点看作持有一组子节点的节点。
UML如下:
图中我们以一公司统计各分公司所有部门的人数为例
角色如下:
1、Organization接口,表示公司的组织结构的抽象,其中定义了统计人数的方法countMember.
2、CompositeOranization组合机构,表示拥有下属机构的机构,如总公司,分公司,都属于组合机构.其持有一个机构列表表示其下属机构.这个是模式中的关键部分
3、LeafOrganization叶子机构,表示没有下属机构的机构,如具体的部门。
代码实现:
/**
* 组织结构接口
* @author saisaimayi
*2018年9月27日
*/
public interface Organization {
/**
* 计算机构人数
* @return 机构人数
*/
public int countMember();
}
/**
* 组合机构实现类
* @author saisaimayi
*2018年9月27日
*/
public class CompositeOrganization implements Organization {
private List<Organization> organs = new ArrayList<Organization>();
public void addOrganization(Organization organ){
organs.add(organ);
}
public void removeOrganization(Organization organ){
organs.remove(organ);
}
/**
* 计算部门人数
*/
public int countMember() {
int result = 0;
for (Organization organ : organs) {
result += organ.countMember();
}
return result;
}
}
/**
* 叶子机构实现类
* @author saisaimayi
*2018年9月27日
*/
public class LeafOrganization implements Organization {
private int member;
public void setMember(int member) {
this.member = member;
}
/**
* 叶子部门计算人数
*/
public int countMember() {
System.out.println("本部门有员工:"+member+"名");
return member;
}
}
public class Client extends TestCase {
public void test(){
CompositeOrganization headQuarters = new CompositeOrganization();
CompositeOrganization subCompanyOne = new CompositeOrganization();
LeafOrganization depOne = new LeafOrganization();
LeafOrganization depTwo = new LeafOrganization();
depOne.setMember(15);
depTwo.setMember(13);
subCompanyOne.addOrganization(depOne);
subCompanyOne.addOrganization(depTwo);
CompositeOrganization subCompanyTwo = new CompositeOrganization();
LeafOrganization depThree = new LeafOrganization();
LeafOrganization depFour = new LeafOrganization();
depThree.setMember(30);
depFour.setMember(40);
subCompanyTwo.addOrganization(depThree);
subCompanyTwo.addOrganization(depFour);
headQuarters.addOrganization(subCompanyOne);
headQuarters.addOrganization(subCompanyTwo);
int count = countForDep(headQuarters);
System.out.println("部门人数为:"+count);
}
/**
* 计算某个部门的人数
* @return
*/
private int countForDep(CompositeOrganization dep) {
return dep.countMember();
}
}
输出结果:
本部门有员工:15名
本部门有员工:13名
本部门有员工:30名
本部门有员工:40名
部门人数为:98
网友评论