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源码解析)的更多相关文章

  1. HashMap源码解析 非原创

    Stack过时的类,使用Deque重新实现. HashCode和equals的关系 HashCode为hash码,用于散列数组中的存储时HashMap进行散列映射. equals方法适用于比较两个对象 ...

  2. HashMap源码解析和设计解读

    HashMap源码解析 ​ 想要理解HashMap底层数据的存储形式,底层原理,最好的形式就是读它的源码,但是说实话,源码的注释说明全是英文,英文不是非常好的朋友读起来真的非常吃力,我基本上看了差不多 ...

  3. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  4. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  5. 最全的HashMap源码解析!

    HashMap源码解析 HashMap采用键值对形式的存储结构,每个key对应唯一的value,查询和修改的速度很快,能到到O(1)的平均复杂度.他是非线程安全的,且不能保证元素的存储顺序. 他的关系 ...

  6. 详解HashMap源码解析(下)

    上文详解HashMap源码解析(上)介绍了HashMap整体介绍了一下数据结构,主要属性字段,获取数组的索引下标,以及几个构造方法.本文重点讲解元素的添加.查找.扩容等主要方法. 添加元素 put(K ...

  7. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  8. 一、基础篇--1.2Java集合-HashMap源码解析

    https://www.cnblogs.com/chengxiao/p/6059914.html  散列表 哈希表是根据关键码值而直接进行访问的数据结构.也就是说,它能通过把关键码值映射到表中的一个位 ...

  9. HashMap 源码解析

    HashMap简介: HashMap在日常的开发中应用的非常之广泛,它是基于Hash表,实现了Map接口,以键值对(key-value)形式进行数据存储,HashMap在数据结构上使用的是数组+链表. ...

  10. 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析

    前面了解了jdk容器中的两种List,回忆一下怎么从list中取值(也就是做查询),是通过index索引位置对不对,由于存入list的元素时安装插入顺序存储的,所以index索引也就是插入的次序. M ...

随机推荐

  1. centos7搭建sonarqube环境+jenkins部署全流程

    一.简介sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量 不遵循代码标准sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写.潜在的 ...

  2. Ubuntu 一直要求依赖的错误

    今天笔者在windows上装linux双系统,选用的ubuntu,因为第> 一次用,所以出现了这个问题. 如题,安装个gcc一直要求我要装依赖,如图 接下来我又开始一个个安装那些依赖,比如 su ...

  3. CTF常见编码及加解密(超全)

    @ 目录 前言 常见CTF编码及加解密 补充 ASCII编码 base家族编码 MD5.SHA1.HMAC.NTLM等类似加密型 1.MD5 2.SHA1 3.HMAC 4.NTLM 5.类似加密穷举 ...

  4. Docker Harbor 高可用 1.7.5版本(七)

    环境说明: node1 10.10.5.135 仓库 1 node2 10.10.5.136 仓库 2 node3 10.10.5.137 客户端 实验内容: Harbor 可以在两台主机之间相互同步 ...

  5. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  6. 【ORA】ORA-39002,ORA-39070,ORA-29283, ORA-06512,ORA-29283解决办法

    今天使用IMPDP导入的时候报了一个错误 ORA-39002: invalid operation  ORA-39070: Unable to open the log file.  ORA-2928 ...

  7. kubernets之pod的删除方式

    一 删除单个pod 1  删除指定命名空间的指定名称的pod k delete po kubia-manual -n defaultpod "kubia-manual" delet ...

  8. Request&Response总结

    Request&Response Request 请求对象的类视图 请求对象常用方法 获取请求路径 返回值 方法名 说明 String getContextPath() 获取虚拟目录名称 St ...

  9. Java集合List-差集、并集、交集

    Java集合List的差集.并集.交集 转载于:https://www.cnblogs.com/qlqwjy/p/9812919.html 一.List的差集 @Test public void te ...

  10. mysql半同步复制跟无损半同步区别

    mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...