UML类图介绍

链式季风
• 阅读 6273

UML类图非常简单,可以用下面的图表示一个类:

UML类图介绍

该图表示一个叫做Person的类,该类有name、age、sex三个private属性,每个属性的类型紧跟在冒号的后面。该类有walk和speak两个方法,其中walk方法是public的,而speak方法是protected的,两个方法的返回值类型紧跟在冒号的后面。
如果要表示一个接口,则用下面的图表示:

UML类图介绍

下面介绍类与类之间的关系。如果按照关系的紧密程度从弱到强划分,类与类之间的关系包括:

  1. 依赖
  2. 关联
  3. 聚合
  4. 组合
  5. 实现
  6. 继承

下面依次对这些关系进行介绍。

依赖关系

依赖关系是所有类间关系中最弱的一种,它用下面的图表示:
UML类图介绍

图中的箭头方向表示依赖的方向,上图表示类A依赖类B。
依赖,顾名思义表示一个实体的存在必须依赖另一个实体的存在。可以这样认为,如果类A依赖类B,那么类A只有在类B存在的情况下,才能编译通过。下面代码是依赖的一个例子:

public class UserController {
    
    private UserService userService;

    public User query(Strint userId) {
        User user = userService.queryUser(userId);
        return user;
    }
}

在这段代码,UserController类同时依赖于UserService和User两个类,可以用下面的类图表示它们的依赖关系:
UML类图介绍

可见依赖关系大量的存在于我们的代码中,但千万不要在项目设计时将全部的依赖关系都画出来,这不仅很累,而且也没有必要。当梳理依赖关系时,先要搞清楚你关注什么,想表达什么,只画出真正需要画的就可以。

关联关系

关联关系表示两个实体间存在一定的联系,这种联系比依赖关系更紧密,不仅仅只是“两个实体触碰到”这样松散的关系。例如Student和School这两个类,一个学生一定会有一个对应的学校,那么Student和School间就存在关联关系,且它们的关系是一对多的。这个关系表现在代码层面如下所示:

class Student {
    private String name;

    private String sex;

    private School school;
}

或者

class Student {
    private String name;

    private String sex;

    private String schoolId;
}

上面这两种代码都可以用下面的UML图表示:
UML类图介绍

关联关系也可以用于领域建模,例如要设计一个骰子游戏,游戏者连续投掷两次筛子,如果两次点数的总数是7,则游戏者赢,否则游戏者输。可以用下面UML图对这个问题进行领域建模,各实体间使用的就是关联关系。这也是关联关系的一种特殊用法。
UML类图介绍

聚合&组合

聚合也是一种关联关系,但是这种关联关系存在整体与部分的语义。例如大雁和大雁群,一只大雁是整个大雁群的一部分。这就是一种聚合关系,具有has-a的语义。下面的UML图用来描述聚合关系。
UML类图介绍

组合是一种强聚合关系,它表示整体和部分之间具有相同的生命周期,同生共死。例如鸟和翅膀,鸟如果死掉了,那么它的翅膀也会跟着死掉。组合关系具有contains-a的语义。下面的UML图用于表达组合关系。
UML类图介绍

记忆聚合和组合UML图画法的小技巧:菱形就相当于一个容器,容器指向的实体就是整体,所以上面图中的菱形分别指向大雁群和鸟。此外,由于组合关系的紧密程度比聚合关系更强,所以组合关系用实心菱形,聚合关系用空心菱形。

继承&实现

继承和实现都是Java中的基础,比较容易理解,它们是类与类之间关系最强的。分别用下面的UML图表示。
继承示例:
UML类图介绍

实现示例:
UML类图介绍

PS:实现关系应该用空心箭头,但我使用的UML画图软件是visual paradigm,找到的表示“实现关系”的箭头就只有实心的。

应用举例

请根据以下描述,画出相应的UML图:
神州六号飞船是神州飞船系列的一种,它由轨道舱、返回舱、推进舱和逃逸救生塔等组成;航天员可以在返回舱内驾驶飞船,轨道舱则是航天员工作和休息的场所。在紧急的情况下,可以利用逃逸救生塔逃生。在飞船两侧有多个太阳能电池翼,可以为飞创提供电能;
根据问题描述,可以抽象出如下实体

  1. 神州飞船
  2. 神州六号飞船
  3. 轨道舱
  4. 返回舱
  5. 推进舱
  6. 逃逸救生塔
  7. 航天员
  8. 太阳能电池翼

绘制的UML图如下所示:
UML类图介绍

点赞
收藏
评论区
推荐文章
雷厉风行 雷厉风行
2年前
StarUML for Mac:如何实现各种UML图的创建和编辑
StarUMLmac版是Macos上一款UML软件建模器,starumlmac下载,不仅能够用于类图、用例图、序列图、活动图以及通信图等强大的绘制操作
Wesley13 Wesley13
4年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Wesley13 Wesley13
4年前
java常用的关键字
1、final关键字final关键字可用于修饰类、方法以及变量。修饰类:该类不能被继承,该类的所有方法和成员都被隐式地指定为final。修饰方法:锁定方法,任何继承类都不能修改他,所有的private方法都被隐式地指定为final方法。修饰变量:若修饰的变量为基本数据类型,该变量值被赋值后不可改变;若修饰的变量为引用类型的变量,该变量
Wesley13 Wesley13
4年前
java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer
第四章:数学函数、字符和字符串math类Math是final类:在java.lang.Math中,所有数学函数都是静态方法在一个java程序中,java.lang包中的所有类是隐式导入的。三角函数方法『此处需要插入图』指数函数方法『此处需要插入图』取整方法
Wesley13 Wesley13
4年前
UML图类的构造方法怎么画
初用UML图有些人会跟我一样想,类的构造方法没有返回值怎么画,百度不到答案让人感到无语,那只能自己动手了。!(https://oscimg.oschina.net/oscnet/6b2e0f78a3b5d44fc8767f68bd7447f3e98.png)如图所示,这是由Eclipse的AmaterasUML自动生成UMl类图的结果。构
Wesley13 Wesley13
4年前
UML类图简单介绍
先上一张图:!大话设计模式UML类图(http://uploadimages.jianshu.io/upload_images/1628444e65597459714a228.png?imageMogr2/autoorient/strip%7CimageView2/2/w/1240)概述类图(ClassDiagram)是面向对象
Stella981 Stella981
4年前
Executor, ExecutorService 和 Executors 间的区别与联系
UML简要类图关系:!(https://oscimg.oschina.net/oscnet/add0342201daad6a6336aacc220bbffa7fa.png)下面详细看一下三者的区别:ExecutorvsExecutorServicevsExecutors
Wesley13 Wesley13
4年前
UML画图笔记
1\.类图:             描述类图的关系,                 a)泛化(一般用于继承)表示:空心箭头实线              b)实现(实现接口)表示:空心箭头虚线              c)聚合(一对多的关系)带空心菱形箭头实线              d)组合(a由b组成)
Stella981 Stella981
4年前
Javascript中,实现类与继承的方法和优缺点分析
Javascript是一种弱类型语言,不存在类的概念,但在js中可以模仿类似于JAVA中的类,实现类与继承第一种方法:利用Javascript中的原型链1//首先定义一个父类23functionAnimal(name,age){4//定义父类的属性5thi
Easter79 Easter79
4年前
Spring两种依赖注入方式的比较
我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入。先看代码:  假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法。如果用spring来管理这个对象,那么有以下两种方式为People设置属性:  1.设值注入:
小万哥 小万哥
2年前
Python 继承和子类示例:从 Person 到 Student 的演示
继承允许我们定义一个类,该类继承另一个类的所有方法和属性。父类是被继承的类,也叫做基类。子类是从另一个类继承的类,也叫做派生类。创建一个父类任何类都可以成为父类,因此语法与创建任何其他类相同:示例,创建一个名为Person的类,具有firstname和la