合成模式又被叫做组成模式
合成模式的意图是为了保证客户端调用单对象与组合对象的一致性
合成模式简化描述就是,为具有树形特征(A包含B,B包含C,C包含D)的对象集合提供一种抽象,使得调用该对象集合与调用该对象集合中的某一个对象在调用形式上(实现同一个抽象方法)保持一致
方法名保持一致,单个对象内部是单个实现,集合形式的对象内部是递归实现
- 一家公司有很多的部门,部门里有不同的员工
- 部门可能会有所调整,比如新增部门或者减少部门
- 部门内部可以再次细化,成立子部门
- 为这个公司提供一个计算员工总数的方法
- 公司、部门和员工具有一定的层级关系
- 公司包含部门,部门包含员工
- 部门可以包含子部门
- 公司的总人数是部门的员工和
- 公司可以添加或者去除部门以及得到员工总数
- 部门可以添加、去除员工以及得到员工总数
- 员工可以得到员工总数,恒为1
针对上面的场景提供下面的代码
public abstract class Basic {
/** * 获取员工总数 * @return */
abstract int getSumOfStaff(int sum);
}
/** * 员工类 * @author wujie */
public class Staff extends Basic {
@Override
int getSumOfStaff(int sum) {
sum+=1;
return sum;
}
}
import java.util.List;
/** * 公司类 * @author wujie */
public class Company extends Basic {
/** * 包含的部门 */
private List<Basic> list;
@Override
int getSumOfStaff(int sum) {
for(Basic basic:list){
sum=basic.getSumOfStaff(sum);
}
return sum;
}
public List<Basic> getList() {
return list;
}
public void setList(List<Basic> list) {
this.list = list;
}
}
/** * 部门类 * @author wujie * */
public class Department extends Basic {
/** * 本部门包含的员工或者子部门 */
private List<Basic> list;
@Override
int getSumOfStaff(int sum) {
for(Basic basic:list){
sum=basic.getSumOfStaff(sum);
}
return sum;
}
public List<Basic> getList() {
return list;
}
public void setList(List<Basic> list) {
this.list = list;
}
}
/** * 一个企业有两个部门 * 一个部门有1个员工和一个子部门,子部门有一个员工 * * @param args */
public static void main(String[] args) {
//公司类声明对象
Company company=new Company();
//公司类的部门集合
List<Basic> departmentList=new ArrayList();
company.setList(departmentList);
//部门一:添加一个员工
Department d1=new Department();
//部门1添加到公司
departmentList.add(d1);
List<Basic> staff1List=new ArrayList();
d1.setList(staff1List);
Staff staff1=new Staff();
staff1List.add(staff1);
Department d11=new Department();
staff1List.add(d11);
List<Basic> staff11List=new ArrayList();
d11.setList(staff11List);
Staff staff11=new Staff();
staff11List.add(staff11);
int sum=0;
System.out.println(company.getSumOfStaff(sum));
}
- 存在集合对象和单一对象具有同种操作需要的场景
- 结合对象具有总-子关系
- 可以按照树形结构遍历集合对象