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. Lagom 官方文档之随手记

    引言 Lagom是出品Akka的Lightbend公司推出的一个微服务框架,目前最新版本为1.6.2.Lagom一词出自瑞典语,意为"适量". https://www.lagomf ...

  2. 剑指offer 面试题5:替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Happy. 编程思想 ...

  3. 机器学习算法·KNN

    机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验 ...

  4. 【Oracle】Oracle SQL的优化软件

    对于SQL开发人员和DBA来说,根据业务需求写出一条正确的SQL很容易.但是SQL的执行性能怎么样呢?能优化一下跑得更快吗?如果不是资深  DBA,估计很多人都没有信心. 幸运的是,自动化优化工具可以 ...

  5. dd命令的详细介绍

    1.命令简介  dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file #输入文件名,缺省为标准输 ...

  6. SAP ERP中权限参数和角色相关表

    SAP版本:S/4 HANA 1809

  7. STM32驱动LCD原理

    TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...

  8. centos7 开放指定端口

    centos7 开放指定端口 #开放8080端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent #重载防火墙 firewall- ...

  9. ROS教程(一):ROS安装教程(详细图文)

    ros教程:ros安装 目录 前言 一.版本选择 二.开始安装 2.1 软件中心配置 2.2 添加源 2.3 安装 三.验证ROS 前言 关于ROS(Robot OS 机器人操作系统),估计看这个教程 ...

  10. a.default.ERROR.httpAjax is not a function

    原因1: 使用的是jQuery的slim构建,它删除了一些东西,ajax就是其中之一. 解决方法: 在此处下载常规(压缩或非压缩)版本的jQuery并将其包含在您的项目中. 原因2: 使用其他库引起了 ...