设计模式应用实例六(组合模式的应用)

前言
本章介绍设计模式中的组合模式,组合模式在实际应用中出现的频率不大,但也不小。比如在权限系统中的菜单树,现实世界中的公司

学习目标

  1. 认识组合模式及概念
  2. 通过刻意重复练习组合模式,深刻脑海,提高反射敏感度:树型—组合
  3. 使用简化版组合模式,快速解决实际问题。

概念:

组合模式是用来描述整体与部分的关系,它将对象组织到树形结构中,最顶层的称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。

记忆关键点:

一种树形结构:只要有上下级等明显的树型结构,就可以应用该模式。

逻辑结构图

其结构简单,多数人都会想到,类似下图
在这里插入图片描述
类结构图
在这里插入图片描述

扩展联想

上面的类结构图中还是比较复杂,如果在实际项目应用中会写比较多的代码。如果进行简化,去掉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、简化的组合模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值