组合模式,将单个对象和组合对象按照完全一样的事物对待,其实就是将一类东西组合在一起,通过条件,选择性的输出;
举个列子: 一个公司旗下,有很多部门,比如it部门,hr部门,等,我现在想知道it部门有多人,这代码怎么写,这个时候使用组合模式就不错
1. 定义抽象类
1.1 抽象类- 公司
/**
* 总部组织
*
* @author wangqinglong01
*/
public abstract class HeadQuarters {
/**
* 部门名称
*/
private String name;
HeadQuarters(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void add(HeadQuarters headQuarters);
public abstract HeadQuarters getChild(String orgName);
public abstract int getStaffCount();
@Override
public String toString() {
return name;
}
}
1.2 实现类-公司
import java.util.ArrayList;
import java.util.List;
/**
* 组合实现类 公司下面的部门
*
* @author wangqinglong01
*/
public class HeadQuartersImpl extends HeadQuarters {
private List<HeadQuarters> headQuarters = new ArrayList<>();
HeadQuartersImpl(String name) {
super(name);
}
@Override
public void add(HeadQuarters headQuarters) {
this.headQuarters.add(headQuarters);
}
@Override
public HeadQuarters getChild(String orgName) {
for (HeadQuarters org : headQuarters) {
HeadQuarters targetOrg = org.getChild(orgName);
if (targetOrg != null) {
return targetOrg;
}
}
return null;
}
@Override
public int getStaffCount() {
int count = 0;
for (HeadQuarters headQuarters : this.headQuarters) {
count += headQuarters.getStaffCount();
}
return count;
}
}
1.3 实现类- 公司旗下的it部门
/**
* it部门
*
* @author wangqinglong01
*/
public class ItDepartment extends HeadQuarters {
public ItDepartment(String name) {
super(name);
}
/**
* 返回部门人数
*
* @return 部门人数
*/
@Override
public int getStaffCount() {
return 20;
}
@Override
public void add(HeadQuarters headQuarters) {
throw new UnsupportedOperationException(this.getName() + "已经是最基本部门,无法增加下属部门");
}
@Override
public HeadQuarters getChild(String orgName) {
if (getName().equals(orgName)) {
return this;
}
return null;
}
}
1.4 客户端
调用 listOrgInfo 即可
/**
* 组合模式客户端
*
* @author wangqinglong01
*/
public class HeadQuartersClient {
private HeadQuarters constructOrganization() {
//构建总部
HeadQuartersImpl head = new HeadQuartersImpl("总公司");
ItDepartment headIt = new ItDepartment("总公司It部");
head.add(headIt);
//构建分公司
HeadQuartersImpl branch1 = new HeadQuartersImpl("天津分公司");
ItDepartment branch1It = new ItDepartment("天津分公司It部");
branch1.add(branch1It);
//将分公司加入到head中
head.add(branch1);
return head;
}
public void listOrgInfo() {
HeadQuarters org = constructOrganization();
System.out.println(String.format("%s共有%d名员工",
org.getName(), org.getStaffCount()));
HeadQuarters subOrg = org.getChild("天津分公司行政部");
System.out.println(String.format("%s共有%d名员工",
subOrg.getName(), subOrg.getStaffCount()));
}
}