一、定义
将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、使用场景
适用于想要表达部分与整体结构场景,以及希望用户忽略对象与单个对象间关系,希望统一使用组合机构中对象场合
三、实例分析
需求:公司有两个部门,商务部和软件部,软件部中包含java开发、js开发和android开发
通过分析可知,所有人员都属于公司员工,可以将每个部门人员分别统计后再汇总来实现
简图:
四、代码实现
1、创建接口IMember,提供获取成员数量方法getMemberCount
public interface IMember {
int getMemberCount();
}
2、创建类JavaDeveloper、AndroidDeveloper和JsDeveloper实现IMember接口,并根据实际情况返回数量
public class JavaDeveloper implements IMember {
@Override
public int getMemberCount() {
return 10;
}
}
public class AndroidDeveloper implements IMember {
@Override
public int getMemberCount() {
return 2;
}
}
public class JsDeveloper implements IMember {
@Override
public int getMemberCount() {
return 4;
}
}
3、统计软件部人员数量及商务部人员数量
统计软件部人员数量:
public class SoftwareDepartment implements IMember {
private ArrayList<IMember> list = new ArrayList<>();
public SoftwareDepartment() {
list.add(new JavaDeveloper());
list.add(new AndroidDeveloper());
list.add(new JsDeveloper());
}
@Override
public int getMemberCount() {
int memberCount=0;
for (IMember member:list){
memberCount+=member.getMemberCount();
}
return memberCount;
}
}
统计商务部人员数量
public class BusinessDepartment implements IMember {
@Override
public int getMemberCount() {
return 30;
}
}
4、统计公司人员数量
public class Company implements IMember {
private ArrayList<IMember> companyMemberList = new ArrayList<>();
public Company() {
companyMemberList.add(new SoftwareDepartment());
companyMemberList.add(new BusinessDepartment());
}
@Override
public int getMemberCount() {
int count=0;
for (IMember member:companyMemberList){
count+=member.getMemberCount();
}
return count;
}
}
5、测试结果
public class CompositeTestClass {
public static void main(String[] args) {
Company company = new Company();
int count = company.getMemberCount();
System.out.println("公司人数:" + count);
}
}
结果:
五、分析
通过组合模式可以将细节进行封装,只需要关注整体即可,更加直观