从IDEA角度来看懂UML图
前言
我们目前已经学习了设计模式的7种设计原则。下面本该是直接进入具体的设计模式系列文章。
但是呢在我们学习设计模式之前我们还是有必要了解一下uml图。因为后续的设计模式文章不出意外应该会很多地方使用到uml图。如果你连uml图都看不懂的话,那么学习起来肯定会有一定的难度。
所以说,这一节就作为承上启下的章节,让我们来了解一下uml图吧。(当然如果你已经会UML图了,你完全可以跳过这个章节)
介绍
按照惯例,我们还是要让大家知道什么是UML图:
UML有很多种类,什么用例图,静态结构图,动态行为图。
而作为java程序猿,我们最关注的的还是静态结构图中的类图即可,所以你只需要记住这一句话就可以了:UML图就是用来描述各个类,接口之间的关系图。
我们下面包括今后的UML类图都是用IntelliJ IDEA自带的类图工具来展示 ,每个软件的画图风格会有一点点区别,但是核心的东西是不会变。
好的,我开始进入主题
类之间的关系
类与类之间的关系我们可以分为以下几点:
由于我们大部分时间使用的是idea自带的工具Uml Support来生成的uml图(快捷键:ctrl+alt+shift+u)。虽然大体类图线条的画法是相同的,但是IDEA生成的UML图的聚合关系和组合关系稍稍有点不同,我们接着往下看.
依赖
只要是在类中用到了对方,那么他们之间就存在依赖关系。
依赖关系包含其他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();
}
}
泛化
泛化关系实际上就是继承关系,他是依赖关系的特例(真子集)。
- 泛化关系实际上就是继承关系
- 如果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图的更多相关文章
- 看懂UML图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- [设计模式] 读懂UML图
类之间关系(由强到弱) realize(继承):三角+实线(指向类),继承类(SUV是一种汽车) generalization(实现):三角+虚线(指向接口),实现接口(汽车是一种车) composi ...
- [转]看懂UML类图
这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...
- 看懂UML类图
这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...
- 看懂UML类图与时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- 看懂UML类图和时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- [转] 看懂UML类图和时序图
PS: 组合关系:实心,一个类A属于另一个类,或多个类,但是类A不能单独存在去使用,A一般是一种抽象的东西 聚合关系:空心,一个类A可以单独存在使用 不论组合聚合,A的方法都会被直接调用. 看懂UML ...
- 看懂类图——UML类图基础
类图 要学懂设计模式,就需要先看得懂类图,类与类之间的关系是学习设计模式的基础,而在软件工程中,类与类之间的关系是通过UML中的类图来体现. 这篇笔记包含的不会是类图的所有东西,包含的只是各个类之间的 ...
- (转)看懂UML类图
转自:http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关 ...
随机推荐
- 分布式事务(3)---RocketMQ实现分布式事务原理
分布式事务(3)-RocketMQ实现分布式事务原理 之前讲过有关分布式事务2PC.3PC.TCC的理论知识,博客地址: 1.分布式事务(1)---2PC和3PC原理 2.分布式事务(2)---TCC ...
- 个人永久性免费-Excel催化剂功能第41波-文件文件夹相关函数
对于日常办公过程中,每天面对的操作离不开文件.文件夹的操作,当然可以用资源管理器.Everything之类的管理软件来管理.但涉及到批量操作时,在Excel环境或许是个更好的方式,前面很多的内容中不断 ...
- vijos P1911 珠心算测验
#include<iostream> using namespace std; int main() { int n; int sum = 0; int num[200]; cin > ...
- 【MySQL】(五)索引与算法
本篇文章的主旨是对InnoDB存储引擎支持的索引做一个概述,并对索引内部的机制做一个深入的解析,通过了解索引内部构造来了解哪里可以使用索引. 1.InnoDB存储引擎支持以下几种常见的索引: B+树索 ...
- java多线程调用run和不调用run的区别
当在java程序中创建一个线程的时候,会三种情况: 1,只运行run方法 2,先执行start,再执行run方法 3,只运行start方法 三者的区别如下: 运行方式 区别 只运行run 只运行run ...
- sqlserver 2008 无法使用特殊主体‘sa’,错误15405
今天莫名其妙的遇到一个问题,还原了几个数据库到新的服务器上,突然发现sa用户对某几个数据库没有权限(用户映射): 我手工勾选相应数据库的db_owner权限之后,报错:无法使用特殊主体'sa',错误1 ...
- Java简单公式计算器
最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...
- python课堂整理10---局部变量与全局变量
一.局部变量与全局变量 1. 没有缩进,顶头写的变量为全局变量 2. 在子程序里定义的变量为局部变量 3. 只有函数能把变量私有化 name = 'lhf' #全局变量 def change_name ...
- java练习---10
package cn.zrjh; public class L { public int id; public String name; public int age; public String c ...
- 关于JS、JQ首行首列固定展示
当时遇见这个问题 是医院手麻系统大批量数据展示,由于是旧项目系统没有使用到前端的架构 只能使用JQ,JS, css完成 也谢谢给予我支持的同行们 固定首行数据: 采用函数的方式进行 JQ /** * ...