设计模式(十)——组合模式(HashMap源码解析)
1 看一个学校院系展示需求
编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系。如图:

2 传统方案解决学校院系展示

3 传统方案解决学校院系展示存在的问题分析
1) 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
2) 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因
此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等
3) 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合模式
4 组合模式基本介绍
基本介绍
1) 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
2) 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
3) 这种类型的设计模式属于结构型模式。
4) 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象
5 组合模式原理类

对原理结构图的说明-即(组合模式的角色及职责)
1) Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理
Component 子部件, Component 可以是抽象类或者接口
2) Leaf : 在组合中表示叶子节点,叶子节点没有子节点
3) Composite :非叶子节点, 用于存储子部件, 在 Component 接口中实现 子部件的相关操作,比如增加(add), 删除。
6 组合模式解决学校院系展示的 应用实例
应用实例要求
1) 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系。
2) 思路分析和图解(类图)

OrganizationComponmet 类
package com.lin.composite;
public abstract class OrganizationComponmet {
private String name;
private String des;
protected void add(OrganizationComponmet organizationComponmet) {
throw new UnsupportedOperationException();
}
protected void remove(OrganizationComponmet organizationComponmet) {
throw new UnsupportedOperationException();
}
public OrganizationComponmet(String name, String des) {
super();
this.name = name;
this.des = des;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
protected abstract void print();
}
University 类
package com.lin.composite; import java.util.ArrayList;
import java.util.List; public class University extends OrganizationComponmet{ List<OrganizationComponmet> organizationComponmets = new ArrayList<OrganizationComponmet>(); public University(String name, String des) {
super(name, des);
} @Override
protected void add(OrganizationComponmet organizationComponmet) {
organizationComponmets.add(organizationComponmet);
} @Override
protected void remove(OrganizationComponmet organizationComponmet) {
organizationComponmets.remove(organizationComponmet);
} @Override
public String getDes() {
return super.getDes();
} @Override
public String getName() {
return super.getName();
} @Override
protected void print() { System.out.println("---------------------" + getName() + "--------------------"); for (OrganizationComponmet organizationComponmet : organizationComponmets) {
organizationComponmet.print();
}
} }
College 类
package com.lin.composite; import java.util.ArrayList;
import java.util.List; public class College extends OrganizationComponmet{ List<OrganizationComponmet> organizationComponmets = new ArrayList<OrganizationComponmet>(); public College(String name, String des) {
super(name, des);
} @Override
protected void add(OrganizationComponmet organizationComponmet) {
organizationComponmets.add(organizationComponmet);
} @Override
protected void remove(OrganizationComponmet organizationComponmet) {
organizationComponmets.remove(organizationComponmet);
} @Override
public String getDes() {
return super.getDes();
} @Override
public String getName() {
return super.getName();
} @Override
protected void print() { System.out.println("---------------------" + getName() + "--------------------"); for (OrganizationComponmet organizationComponmet : organizationComponmets) {
organizationComponmet.print();
}
} }
Department 类
package com.lin.composite;
public class Department extends OrganizationComponmet{
public Department(String name, String des) {
super(name, des);
}
@Override
public String getDes() {
return super.getDes();
}
@Override
public String getName() {
return super.getName();
}
@Override
protected void print() {
System.out.println(getName());
}
}
Client类
package com.lin.composite;
public class Client {
public static void main(String[] args) {
OrganizationComponmet university = new University("波大", "美国大学");
OrganizationComponmet college1 = new College("计算机学院", "计算机");
OrganizationComponmet college2 = new College("中文学院", "中文");
university.add(college1);
university.add(college2);
OrganizationComponmet department1 = new Department("软件工程专业", "软件");
OrganizationComponmet department2 = new Department("大数据专业", "大数据");
OrganizationComponmet department3 = new Department("汉语言专业", "汉语言");
OrganizationComponmet department4 = new Department("中华文化专业", "中华文化");
college1.add(department1);
college1.add(department2);
college2.add(department3);
college2.add(department4);
university.print();
System.out.println("--------------------------------------------");
college1.print();
}
}
7 组合模式在 JDK 集合的源码分析
1) Java 的集合类-HashMap 就使用了组合模式
2) 代码分析


package com.lin.composite; import java.util.HashMap;
import java.util.Map; public class CompositeApply { public static void main(String[] args) {
Map<Object, Object> hashMap = new HashMap<Object, Object>();
hashMap.put(0, "zero");
System.out.println(hashMap); Map<Object, Object> map = new HashMap<Object, Object>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three"); hashMap.putAll(map);
System.out.println(hashMap);
}
}
8 组合模式的注意事项和细节
1) 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
2) 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.
3) 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
4) 需要遍历组织机构,或者处理的对象具有树形结构时, 非常适合使用组合模式.
要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式
仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。
设计模式(十)——组合模式(HashMap源码解析)的更多相关文章
- HashMap源码解析 非原创
Stack过时的类,使用Deque重新实现. HashCode和equals的关系 HashCode为hash码,用于散列数组中的存储时HashMap进行散列映射. equals方法适用于比较两个对象 ...
- HashMap源码解析和设计解读
HashMap源码解析 想要理解HashMap底层数据的存储形式,底层原理,最好的形式就是读它的源码,但是说实话,源码的注释说明全是英文,英文不是非常好的朋友读起来真的非常吃力,我基本上看了差不多 ...
- 【转】Java HashMap 源码解析(好文章)
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...
- Java中的容器(集合)之HashMap源码解析
1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...
- 最全的HashMap源码解析!
HashMap源码解析 HashMap采用键值对形式的存储结构,每个key对应唯一的value,查询和修改的速度很快,能到到O(1)的平均复杂度.他是非线程安全的,且不能保证元素的存储顺序. 他的关系 ...
- 详解HashMap源码解析(下)
上文详解HashMap源码解析(上)介绍了HashMap整体介绍了一下数据结构,主要属性字段,获取数组的索引下标,以及几个构造方法.本文重点讲解元素的添加.查找.扩容等主要方法. 添加元素 put(K ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 一、基础篇--1.2Java集合-HashMap源码解析
https://www.cnblogs.com/chengxiao/p/6059914.html 散列表 哈希表是根据关键码值而直接进行访问的数据结构.也就是说,它能通过把关键码值映射到表中的一个位 ...
- HashMap 源码解析
HashMap简介: HashMap在日常的开发中应用的非常之广泛,它是基于Hash表,实现了Map接口,以键值对(key-value)形式进行数据存储,HashMap在数据结构上使用的是数组+链表. ...
- 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析
前面了解了jdk容器中的两种List,回忆一下怎么从list中取值(也就是做查询),是通过index索引位置对不对,由于存入list的元素时安装插入顺序存储的,所以index索引也就是插入的次序. M ...
随机推荐
- SparkSql自定义数据源之读取的实现
一.sparksql读取数据源的过程 1.spark目前支持读取jdbc,hive,text,orc等类型的数据,如果要想支持hbase或者其他数据源,就必须自定义 2.读取过程 (1)sparksq ...
- [Abp]Abp 新手入门随记
项目结构说明 *.Application 应用服务实现 *.Application.Contracts 包含DTO及应用服务接口 *.DbMigrator 数据迁移项目 开发和生产环境迁移数据库架构和 ...
- java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式
作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记 接口类:Animals 1 public interface Animals { 2 3 public void e ...
- 【Git】简易使用教程
Git简介 诞生 简单的来说,就是为了托管庞大的Linux源码,开始选择了商用的版本控制系统BitKeeper,但是因为一系列操作,BitKeeper不让用了,所以Linus花了两周时间自己用C写了一 ...
- 天梯赛练习 L3-011 直捣黄龙 (30分) dijkstra + dfs
题目分析: 本题我有两种思路,一种是只依靠dijkstra算法,在dijkstra部分直接判断所有的情况,以局部最优解得到全局最优解,另一种是dijkstra + dfs,先计算出最短距离以及每个点的 ...
- 温故而知新--day2
温故而知新--day2 类 类与对象 类是一个抽象的概念,是指对现实生活中一类具有共同特征的事物的抽象.其实列化后称为对象.类里面由类属性组成,类属性可以分为数据属性和函数属性(函数属性又称为类方法) ...
- Java 基于 mysql-connector-java 编写一个 JDBC 工具类
用到的 jar 包 jar包地址: mysql-connector-java-5.1.47.jar junit-4.13.jar Maven: <!-- mysql驱动 --> <d ...
- 【Python】在CentOS6.8中安装pip9.0.1和setuptools33.1
wget https://bootstrap.pypa.io/ez_setup.py python ez_setup.py install --如果这个文件安装需要下载的文件无法下载的话,手动下载,放 ...
- 【九阳神功】Nessus 8_VM不限IP及AWVS破解版合体部署
Nessus 8下载地址: https://moehu-my.sharepoint.com/personal/ximcx_moebi_org/_layouts/15/download.aspx?Sou ...
- SAP FTP FOR ABAP programing
近来忙的不可开交,忙的一塌糊涂,呵呵,今天怀揣愧疚之心,上来分享博文一篇,算是对自己的一点安慰. 首先在SAP系统中提供了很多的FTP示例程序,如下: RSFTP001 SAPFT ...