看一个学校院系展示需求:编写程序展示学校院系结构:需求是这样的,一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系。
----------------**学院--------------------------------
--------法学院------------------------------------------
--------文学院------------------------------------------
对外汉语专业(本科)
汉语言文学专业(本科)
广告学专业(本科)
广播电视编导(本科 艺术类)
播音与主持艺术(本科 艺术类)
语文教育专业(专科)
广告设计与制作专业(专科)
--------计算机与大数据科学学院--------------------------
计算机科学与技术
数据科学与大数据技术
网络工程
软件工程
物联网工程
传统方案学校院系展示图:
传统方案解决学校院系展示问题分析:
- 将学院看做是学校的子类,系是学院的子类实际上是站在组织大小角度来分析问题的。
- 实际上我们的要求是,在一个页面中展示学校的院系组成,一个学校有多个学院,一个学院有多个系!因此这种方案不能很好的实现对学校院系的管理操作,比如说对学院、系的添加、删除和遍历等。
- 解决方案:把学校、院、系看做是组织结构,他们之间没有继承关系,而是一个树形结构,可有更好的实现管理操作====>组合模式。
组合模式基本介绍:
- 组合模式又叫整体-部分模式,它创建了对象组的树形结构,将对象组组合成树状结以表示整体和部分的关系。
- 组合模式依据树形结构来组合对象,用来表示部分和整体层次。
- 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象和组合对象。
组合模式的原理类图:
对原理结构图的说明即(组合模式的角色和职责):
1)Component这是组合中对象声明接口,在适当情况下实现所有类共有的接口默认行为,用于访问和管理Component子部件。它可以是抽象类或者接口。
2)Leaf:在组合中表示叶子节点,叶子节点没有子节点。
3)Composite:非叶子节点,用于存储子部件,在component接口中实现子部件的相关操作,比如说增加、删除等操作。
组合模式解决的问题:
- 组合模式解决这样的问题:当我们要处理的对象可以生成一颗树形结构,而我们要对树上的节点进行操作时,它能够提供一致的方式,而不用考虑它是叶子节点还是非叶子节点。
- 对应的示意图:
具体解决方案:
具体代码实现:
组合模式在jdk源码中的分析:
- jdk源码中,HashMap就是用了组合模式。
- 代码分析+Debug源码。
组合模式的细节和注意事项:
- 简化客户端操作,客户端只需要面对一致的对象而不用考虑整体部分或者叶子节点的问题。
- 具有较强的扩展性,当我们要改组对象时,我们只需要调整内部的层次关系,客户端不需要做出任何改变。
- 方便创建出复杂的层次结构,客户端不需要理会组成模式中的具体实现细节,容易添加节点或者叶子节点从而创造出复杂的树形结构。
- 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
- 要求较高的抽象性,如果叶子和结点有很大差异的话,比如说很多方法和属性不相同,不适合使用组合模式。