前言

我们目前已经学习了设计模式的7种设计原则。下面本该是直接进入具体的设计模式系列文章。

但是呢在我们学习设计模式之前我们还是有必要了解一下uml图。因为后续的设计模式文章不出意外应该会很多地方使用到uml图。如果你连uml图都看不懂的话,那么学习起来肯定会有一定的难度。

所以说,这一节就作为承上启下的章节,让我们来了解一下uml图吧。(当然如果你已经会UML图了,你完全可以跳过这个章节)

介绍

按照惯例,我们还是要让大家知道什么是UML图:

UML有很多种类,什么用例图,静态结构图,动态行为图。

而作为java程序猿,我们最关注的的还是静态结构图中的类图即可,所以你只需要记住这一句话就可以了:UML图就是用来描述各个类,接口之间的关系图

我们下面包括今后的UML类图都是用IntelliJ IDEA自带的类图工具来展示 ,每个软件的画图风格会有一点点区别,但是核心的东西是不会变。

好的,我开始进入主题

类之间的关系

类与类之间的关系我们可以分为以下几点:

由于我们大部分时间使用的是idea自带的工具Uml Support来生成的uml图(快捷键:ctrl+alt+shift+u)。虽然大体类图线条的画法是相同的,但是IDEA生成的UML图的聚合关系和组合关系稍稍有点不同,我们接着往下看.

依赖

只要是在类中用到了对方,那么他们之间就存在依赖关系。

依赖关系包含其他5中关系。是最大的一层关系。

  1. 类中用到了对方
  2. 如果是类的成员属性
  3. 如果是方法的返回类型
  4. 是方法接收的参数类型
  5. 方法中使用到
//手机类
public class CellPhone { //手机可以玩游戏
public void playGames(){
System.out.println("play games");
}
} //普通人
public class Person { //买手机
public CellPhone buyCellPhone(){
return new CellPhone();
} //买个手机玩游戏
public void play(){
CellPhone cellPhone = buyCellPhone();
cellPhone.playGames();
}
}

泛化

泛化关系实际上就是继承关系,他是依赖关系的特例(真子集)。

  1. 泛化关系实际上就是继承关系
  2. 如果A类继承了B类,我们就说A和B存在泛化关系
//Person代表人
public class Person { } //Man代表男人
public class Man extends Person{ }

实现

实现关系实际上就是A类实现B接口,他是依赖关系的特例(真子集)。

//Dao接口
public interface Dao { }
//Dao实现
public class DaoImpl implements Dao { }

关联、聚合、组合

为什么把这三个放在一起呢?

因为三者在代码上的表现相同,只是语意上有所差别。

1 关联:

类与类之间的联系,关系具有多重性,如:

“1”(表示有且仅有一个)

“0...”(表示0个或者多个)

“0,1”(表示0个或者一个)

“n...m”(表示n到 m个都可以)

“m...*”(表示至少m个)

2 聚合:

部分可以离开整体单独存在,举一个例子。学校类中有一个学生类。当我们创建一个学校类的时候,可能因为刚创办,还没有学生。所以学生类是可以不存在的。不影响学校类的创建。他是依赖关系的特例(真子集)。

3 组合:

整体和部分同生共死,部分脱离整体会变得毫无意义,强调同生共死的一致的生命周期。

例如学生类中的身份证证类。每个学生肯定都会有身份证。在学生类被实例化成功以后,身份证类也被实例化成功。学生类是不能脱离身份证类单独存在的。他是依赖关系的特例(真子集)。


//学校
public class School {
public List<Student> studnets;
} //学生
public class Student {
private IdentityCard identityCard = new IdentityCard(); //组合关系,创建student的时候也创建了身份证
} //身份证
public class IdentityCard {
private String id = UUID.randomUUID().toString();
}

一个学校有很多个学生,一个学生只有一个身份证。所以上面三个类的UML图如下:

首先我们来看实线箭头,箭头方向指的是依赖的方向。School箭头指向Student标注1 * 表示:一个学校有多个学生。

Student的实线箭头指向IdentityCard并且标注的是1 1表示:一个学生只有一个学校和一个身份证。

然后我们看菱形图。正常来说,聚合关系应该是空心的菱形图,组合关系才是实心的菱形图,但是IDEA的集成工具将聚合和依赖关系都以实心菱形图来表示。

按照标准的uml图来说,student和school之间应该是空心的菱形图。IdentityCard与Student才是实线的菱形图。

总结

虽然说idea的画法有点不同,为了他的便利性我们也忍了。就好比大肠的功能虽然很脏,但是为了它的美味我能仍受,并且享受它。

好了,UNL图就到这里了,我们前期铺垫了那么多,从下一节开始终于进入了主题,具体的设计模式系列。

从IDEA角度来看懂UML图的更多相关文章

  1. 看懂UML图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  2. [设计模式] 读懂UML图

    类之间关系(由强到弱) realize(继承):三角+实线(指向类),继承类(SUV是一种汽车) generalization(实现):三角+虚线(指向接口),实现接口(汽车是一种车) composi ...

  3. [转]看懂UML类图

    这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...

  4. 看懂UML类图

    这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...

  5. 看懂UML类图与时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  6. 看懂UML类图和时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  7. [转] 看懂UML类图和时序图

    PS: 组合关系:实心,一个类A属于另一个类,或多个类,但是类A不能单独存在去使用,A一般是一种抽象的东西 聚合关系:空心,一个类A可以单独存在使用 不论组合聚合,A的方法都会被直接调用. 看懂UML ...

  8. 看懂类图——UML类图基础

    类图 要学懂设计模式,就需要先看得懂类图,类与类之间的关系是学习设计模式的基础,而在软件工程中,类与类之间的关系是通过UML中的类图来体现. 这篇笔记包含的不会是类图的所有东西,包含的只是各个类之间的 ...

  9. (转)看懂UML类图

    转自:http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关 ...

随机推荐

  1. 5分钟完成mysql离线安装

    1. 场景描述 mysql离线安装并不复杂,就是经常会出现漏东西,有时候的搞半天,总结下,快速离线安装mysql,直接把下面的命令敲一遍就好,5-10分钟就能安装好. 2. 解决方案 安装的mysql ...

  2. CDQZ集训DAY9 日记

    彻彻底底的爆炸了…… 考试上来第一题看完30分暴力后就不知道怎么打了,然后看第二题,一开始脑残以为是网络流,后来发现是树状结构后觉得是那个经典的n^2的树上背包DP,然而脑子又一次犯笨,竟然,竟然去枚 ...

  3. WinForm控件之【CheckedListBox】

    基本介绍 复选框列表控件,以复选框的形式将一个或多个项列表展示,从目前的情况来看应用非常有限并不广泛. 常设置属性.事件 CheckOnClick:值为true时单击项即可更改项的勾选状态,值为fal ...

  4. py+selenium一个可被调用的登录测试脚本【待优化】

    大部分系统现在都有登录页面,本文主要尝试写一个登录的测试脚本,及另一个脚本调用它登录测试已登录的页面模块. 目标: 登录脚本:从excel里获取登录的测试数据(包括异常测试)→执行登录脚本→输出是否通 ...

  5. BFM使用 - 获取平均脸模型的68个特征点坐标

    使用版本:2009 数据说明网址:https://faces.dmi.unibas.ch/bfm/index.php?nav=1-1-0&id=details 数据下载网址:https://f ...

  6. fjnu2016-2017 低程 PROBLEM B 捧杯

    #include <iostream>#include <cmath>using namespace std; int _gcd(int x,int y){ return y= ...

  7. Linnux命令大全(vim)

    vim复制和粘贴的基本命令(注:需先退出编辑模式)    yy复制游标所在行整行.或大写一个Y. (常用)    2yy或y2y复制两行. (常用)    y^复制至行首,或y0.不含游标所在处字元. ...

  8. [04] HEVD 内核漏洞之IntegerOverflow

    作者:huity出处:https://www.cnblogs.com/huity35/p/11252574.html版权:本文版权归作者所有.文章在博客园.看雪.个人博客同时发布.转载:欢迎转载,但未 ...

  9. UnityWebSocket

    !!!转载注明:http://www.cnblogs.com/yinlong1991/p/unity_ylwebsocket.html Unity WebSocket 使用 Demo 线上测试地址 h ...

  10. 温故而知新,重温 Java 7 的那些“新”特性

    2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事.有不少同学都担心 Java 的前途,我当时傻不啦叽地也很担心:自己刚 ...