设计模式(十)——组合模式(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 ...
随机推荐
- mysql的binlog+maxwell+kakka
1.业务库痛点及解决⽅案 初期出⾏业务的订单相关,是以mysql作为业务库为基准的,但是随着业务线增多,每⽇新增数据指 数上涨,⼏乎在每天的⾼峰期期间,都会出现业务库所在服务器的cpu.IO.内存等跑 ...
- LAMP架构之PHP-FPM 服务器 转
安装PHP 解决依赖关系 # 请配置好yum源(系统安装源及epel源)后执行如下命令: yum -y groupinstall "Desktop Platform Development& ...
- linux下安装docker容器
1.安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位.系统内核版本为 3.10 以上,可 ...
- Lagom 官方文档之随手记
引言 Lagom是出品Akka的Lightbend公司推出的一个微服务框架,目前最新版本为1.6.2.Lagom一词出自瑞典语,意为"适量". https://www.lagomf ...
- WPF学习笔记02_布局
布局原则 WPF窗口只能包含单个元素.如果要放置多个元素,需要放置一个容器,然后在容器中添加元素. 不应显示的设定元素的尺寸 不应该使用屏幕坐标指定元素的位置 布局容器的子元素"共享&quo ...
- ICMP协议概述
• ICMP是三层协议,和IP.ARP.ICMP同属三层 • IP协议中的6是代表上层的TCP协议,17代表UDP协议,1代表同层的ICMP协议 • ICMP协议主要用来探测 ...
- 晋升新一线的合肥,跨平台的.NET氛围究竟如何?
大伙可能不知道,2020年合肥已经成功晋升为新一线城市了.本文通过对目前合肥.NET招聘信息以及公众号的相关数据的分析来看下目前合肥.NET的大环境.就着2020中国.NET开发者峰会的顺利举行的东风 ...
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
- git文件操作
git下载地址: https://git-scm.com/download mac 直接使用brew下载brew install git 1Git一般工作流程: 1.在工作目录创建版本库 2.在工作目 ...
- ASP.NET Core错误处理中间件[1]: 呈现错误信息
NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件.当ASP.NET Core应用在处理请求过程中出现错误时,我们可 ...