前言
本章介绍设计模式中的组合模式,组合模式在实际应用中出现的频率不大,但也不小。比如在权限系统中的菜单树,现实世界中的公司
学习目标
- 认识组合模式及概念
- 通过刻意重复练习组合模式,深刻脑海,提高反射敏感度:树型—组合
- 使用简化版组合模式,快速解决实际问题。
概念:
组合模式是用来描述整体与部分的关系,它将对象组织到树形结构中,最顶层的称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。
记忆关键点:
一种树形结构
:只要有上下级等明显的树型结构,就可以应用该模式。
逻辑结构图
其结构简单,多数人都会想到,类似下图
类结构图
扩展联想
上面的类结构图中还是比较复杂,如果在实际项目应用中会写比较多的代码。如果进行简化,去掉Component和Leaf,就变成如下图
Composite即是根,树枝,也是叶子
限制
组合模式的限制:其所处理的不包含复杂业务过程,只作简单树型结构展示,不适用于处理企业复杂业务过程。如有复杂业务过程需要请与其它模式一起使用。
实例
实际项目应用中,我们可能需要实现如下类似的功能,比如统计如下图的数据
图中所展示的是上海市公安局需要统计整个辖区内酒店及入住旅客数(注:有类似案例,但这个图是本人画的且数据也是假的),而其下有很多派出所,它们也需要统计其辖区内酒店及入住旅客数。公安局所展示的统计数是其辖区内所有派出所统计数之和。因此,其组织机构就构成一树型,适用组合模式解决。
代码
public class PoliceOfficeHotelInfo {
private String policeStationName;//公安局名
private Integer hotelTotal;//旅馆总数
private Integer checkInTotal;//入住旅客总数
....
private List<PoliceOfficeHotelInfo> childs;
public boolean hasChild() {
return this.childs == null?false:(this.childs.size() == 0 ? false : true);
}
public void add(PoliceOfficeHotelInfo child) {
if(this.childs == null )this.childs = new LinkedList<PoliceOfficeHotelInfo>();
this.childs.add(child);
}
}
public class Service{
public PoliceOfficeHotelInfo statisticByPoliceId(Integer policeId) throws Exception{
///省略查询统计数据
PoliceOfficeHotelInfo root = new PoliceOfficeHotelInfo();
root.setName("上海市公安局");
root.setHotelTotal(1000);
///省略查询下属派出所统计数据
for(....){
PoliceOfficeHotelInfo child = new PoliceOfficeHotelInfo();
child.setName("上海市闵行区XX派出所");
child.setHotelTotal(591);
root.add(child);
}
}
}
客户端程序(controller)调用后即得到树型结构。
回顾
1、介绍组合模式的概念,结构
2、简化的组合模式