UML类图简述及IDEA中UML插件的安装和使用

序言

在上软件构造这门课中,随着课程的深入,PPT上出现了许多的类图,初次看起来不太懂各种箭头指向表明的含义;此外,老师还提到了许多类与类之间的关系,依赖、组合、泛化、实现等等,其在UML类图上都有体现。同时考虑到UML类图的在工作学习种会广泛使用,以及其清晰简洁的类与类之间关系的表示,同时可以在我们的实验报告中用类图展示类与类之间关系,简洁明了,由此产生了学习UML类图的想法,到网上查阅资料学习并撰写博客记录。

UML图

UML图定义

​ UML图,实际上是一种语言, 统一建模语言,又称标准建模语言,是用来对软件密集系统进行可视化建模的一种语言。UML的包括UML语义UML表示法两个元素。

​ UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建模方面,特别是在软件架构层次,已经被验证有效。统一建模语言(UML)是一种模型化语言。模型大多以图表的方式表现出来。一份典型的建模图表通常包含几个块或框,连接线和作为模型附加信息之用的文本。这些虽简单却非常重要,在UML规则中相互联系和扩展。

​ UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等

UML图分类

  1. 用例图。
  2. 静态结构图:类图、对象图、包图、组件图、部署图。
  3. 动态行为图:交互图(时序图与协作图)、状态图、活动图。

说明:

  • 类图是描述类与类之间的关系,是UML图中最核心的。

下面着重介绍UML类图

UML类图

​ UML类图的介绍:

  • 描述系统中类(对象)本身的组成(成员属性和成员方法)和类(对象)之间的各种静态关系
  • 类之间的关系:依赖、泛化、实现、关联、聚合与组合。

类图的依赖关系(Dependence)

​ 只要是在类中用到了对方,那么他们之间就存在依赖关系,如果没有对方,甚至连编译都过不了。依赖关系是类与类之间最广泛、最普遍也是最基础的关系。

​ 下面几条为判断类依赖关系的依据:

  • 类中用到了对方

  • 类的成员属性

  • 方法中使用到

  • 是方法的返回类型

  • 是方法接收的参数类型

    ​ 就拿最简单的Person来举例。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Person{
    private IDnumber id;
    public void setIDnumber(IDnumber id){
    this.IDnumber = id;
    }
    public IDnumber getIDnumber(){
    return this.id;
    }
    }
    class IDnumber{
    }

    ​ 每个人Person都有自己的身份证号,这里新建一个IDnumber类,使用到了IDnumber类,而id又是Peroson的成员变量,同时在setIDnumber方法传入参数类型也为IDnumber ,getIDnumber方法中返回的类型也为IDnumber,只要存在上述的任意一条出现,就可以说IDnumber类和Peroson类构成了依赖关系。

    ​ 在UML类图中,用带箭头的虚线表示,箭头指向被依赖方,比如说,这里Person类指向IDnumber类。如下图所示。

类图中的泛化关系(Generalization)

​ 泛化关系实际上就是继承关系,比如B类(子类)继承了A类(父类),二者构成了泛化关系。泛化关系是依赖关系的特例。前面已经提到依赖关系是最普遍的关系,而这里则是针对关系的特点再细分。

​ 这里就用Human和Person来举例,每个人都是人类,都要吃饭和睡觉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class Human {
public void eat() {}
public void sleep() {}
}
class Person extends Human {
private IDnumber idnumber;
@Override
public void eat(){
System.out.println("人吃饭");
}
@Override
public void sleep(){
System.out.println("人睡觉");
}
}

​ 在UML类图中,用带三角箭头的实线表示泛化关系,其箭头指向父类。如下图所示。

类图中的实现关系(Realization)

​ 实现关系就是A类实现B接口,表示类具备了某种能力,也是依赖关系的特例。

​ 这里就用Person类和Swimming接口来举例,并不是每个人都会游泳,就比如说我这只“旱鸭子”。

1
2
3
4
5
6
7
8
9
10
public interface Swimming {
public void swim() {}
}
class Person implenment Swimming {
private String name;
@override
public void swim(){
System.out.println("人游泳");
}
}

​ 在UML类图中带三角箭头的虚线表示依赖关系,其箭头指向实现的接口。如下图所示。

类图中的关联关系(Association)

​ 一个类中的成员变量(成员属性)用到了其他类,则称二者构成关联关系。关联关系实际上就是类与类之间的联系,也是依赖关系的特例。

​ 关系具有导航性,即双向关系或单向关系,单向一对一关系,双向一对一关系。

​ 关系具有多重性,如“1”表示有且仅有一个,“0…”表示0个或者多个,“0,1”表示0个或1个,“i…j”表示i到j个都可以,“m…*”表示至少m个。

​ 这里依旧拿Person和IDnumber来举例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
现在Person类和IDnumber类的关系就是关联关系,Person类的成员属性中用到了IDnumber类,此时是单向一对一的,Person对应IDnumber,而IDnumber并没对应Person。
*/
public class Person{
private IDnumber id;
public void setIDnumber(IDnumber id){
this.IDnumber = id;
}
public IDnumber getIDnumber(){
return this.id;
}
}
class IDnumber{
}

UML类图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
这段表示Person与IDnumber关系仍是关联关系,但与上面的单向一对一的不同,此时,Person对应IDnumber,而IDnumber也对应Person,是双向一对一关系。
*/
public class Person{
private IDnumber id;
public void setIDnumber(IDnumber id){
this.IDnumber = id;
}
public IDnumber getIDnumber(){
return this.id;
}
}
class IDnumber{
private Person person;
}

​ UML类图如下:

​ 在UML类图中带箭头的实线表示关联关系,箭头指向关联类。

类图中的聚合关系(Aggregation)

​ 聚合关系表示的是整体和部分的关系,整体与部分可以分离,部分具有一定的独立性。整体和部分具有各自的生命周期,部分可以属于多个对象,也可以被多个对象共享;比如计算机和CPU、鼠标、键盘,公司与员工的关系。

​ 在代码层面来讲,聚合与关联是一致的,只能从语义上来区分。聚合关系是关联关系的特例,具有关联的导航性与多重性。

​ 这里拿Computer类和Mouse类、Keyboard类来举例,电脑有鼠标、键盘等组成,但鼠标、键盘都可以拔下来,电脑损害不会损坏到鼠标、键盘,鼠标、键盘损坏也不会损坏电脑,换个新鼠标、键盘就是了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Computer
private Mouse mouse;
private Keyboard keyboard;
public void setMouse(Mouse mouse){
this.mouse = mouse;
}
public void setKeyboard(Keyboard keyboard){
this.keyboard= keyboard;
}
}
class Mouse{
}
class Keyboard{
}

​ 在UML类图中用带空心菱形的实线表示,菱形指向整体。如图所示。

类图中的组合关系(Composition )

​ 组合关系表示的也是整体和部分的关系,但是聚合关系的升级,整体和部分不可以分开,部分不能从整体中分离出来,创建了整体的同时,部分也随之创立,共诞生、共灭亡。同样是关联关系的特例。

​ 这里依旧拿Person和Heart类举例,每个人都有心脏,自一出生下来,心脏无时无刻不跳动,当然不跳动了,人就die了,同生共死。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Person{
private IDnumber id; //聚合关系
private Heart heart = new Heart();
public void setIDnumber(IDnumber id){
this.IDnumber = id;
}
public IDnumber getIDnumber(){
return this.id;
}
}
class IDnumber{
}
class Heart{
}

UML类图如下:

​ 此外,还有一种特例,会将聚合关系升级成组合关系,即级联删除。其前提是:类A与类B是聚合关系,A是整体,B是部分;当销毁删除A的同时,连同B一块销毁删除,这就是级联删除。当定义了级联删除时,那么A与B由原来的聚合关系升级为组合关系。就比如说上面举的Person和IDnumber的例子,删除Person时连同IDnumber一块删除,那么IDnumber和Person就是组合关系了。

​ 在UML类图中用带实心菱形的实线表示,菱形指向整体。

类图关系小结

​ 类图的6种关系中,其中依赖关系是最普遍、最基础、最广泛的一类关系,再根据关系的特点细分,可以划分出泛型、实现、关联、组合、聚合关系,其都是依赖关系的特例。就像人类社会一般,每个人都与他人之间有着依赖关系,维持着人际关系,再根据人际关系特点或身份等等,分成各种关系,诸如父子、师生、朋友等等关系。

IDEA中UML插件的安装与使用

UML的安装

​ 第一步:打开IDEA,选中左上角的文件(File)—>设置(Settings)—>插件(Plugins),搜索UML,这里推荐PlantUML,然后安装,安装完成后需要重新启动IDEA。

​ 第二步:重启IDEA完成后,选中左上角的文件(File)—>新建(new),可以发现一个PlantUML File,说明可以创建UML文件了

​ 点击出现文件创建,输入文件名,以及选择UML图的类型,这里选择class,即我们最常用的UML类图。

​ 下面是初次创建其给我们的示例:

​ 如想了解更多有关其类图的信息可以到其官网。

​ 传送门:https://plantuml.com/class-diagram

​ 若要学习绘制UML图的语法,可以到PlantUML的github上获取资源。

​ 传送门:https://github.com/plantuml/plantuml

PlantUML语法

​ 这里给出常用语法:

符号 含义 示例 示例含义
UML图中体现为实线
.. UML图中体现为虚线
..> 依赖 A..>B 类A依赖于B
–> 关联 A..>B 类A关联于B
–|> 继承 A–|>B 类A继承于B
..|> 实现 A..|>B 类A实现接口B
–o 聚合 A–oB 类A聚合了B
–* 组合 A–*B 类A组合了B

​ 注:

  • 这里给符号>, o, *指向那一侧,在UML图中会如实体现。
  • 还支持双向箭头>、o、*,比如说关联关系中的双向单一关系,可以用A<–>B,其效果如前面所展示的Person和IDnumber的双向单一关系的UML类图一致。
  • 在左侧的类一般在UML图的上侧,如Human–|>Person,Person..>IDnumber,其UML图如前面所说类图中泛化关系的类图所示。

​ 然后是权限修饰符:

符号 含义 示例 示例含义
- private -id: IDnumber private IDnumber id;
+ public +id: IDnumber public IDnumber id;
# protected #id: IDnumber protected IDnumber id;

​ 再是抽象类和接口:

​ 可直接用抽象类和接口对应关键词即可,abstract和interface来声明即可。

​ 建议:根据第一次新建UML类图文件其官方给出的示例,照猫画虎,稍加研究,很快就可以上手,需要时间不到半小时,而且一旦熟练掌握后,效率十分之高,比拖拽画类图方便很多,同时plantUML做到了所见即所得,就是实时预览,十分方便。

参考资料

[1] 尚硅谷UML介绍:https://www.bilibili.com/video/BV1G4411c7N4?p=23&spm_id_from=pageDriver

[2] PlantUML语法:https://www.cnblogs.com/liruilong/p/11506280.html

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2022 1nvisble
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信