快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图

  • 前言
  • 一、UML类图简介
  • 二、类之间的六大关系及UML类图
    • 1、依赖关系及UML类图表示
    • 2、泛化关系及UML类图表示
    • 3、实现关系及UML类图表示
    • 4、关联关系及UML类图表示
    • 5、聚合关系及UML类图表示
    • 6、组合关系及UML类图表示
  • 三、如何绘制UML类图?
    • 1. IDEA安装PlantUML Intergration插件
    • 2. PlantUML用法
    • 3. PlantUML绘制UML类图的常见语法
      • 3.1 语法精髓
      • 3.2 绘制类与类之间的依赖关系语法
      • 3.3 绘制类与类之间的泛化关系语法
      • 3.4 绘制类与类之间的实现关系语法
      • 3.5 绘制类与类之间的关联关系语法
      • 3.6 绘制类与类之间的聚合关系语法
      • 3.7 绘制类与类之间的组合关系语法
  • 四、UML类图所有类之间关系及符号表示一览图

前言

一个合格的程序员,要想成长为一个高级工程师,不仅仅需要大量代码的编写,更需要对设计模式具有深入的了解和灵活的应用。从本篇文章开始,我将通过对【尚硅谷设计模式】视频课程的学习总结,尝试以最简单,最通俗易懂的方式完成对设计模式的讲解。

学习设计模式必不可少的一项能力就是能读懂UML类图,能够将自己的设计思路绘制成UML类图便于相互交流,其实稍有经验的程序员应该对UML类图都不陌生,因为我们平常会使用很多二次开发包,一般二次开发包都会提供一份包含本开发包的所有类相关的UML类图,通过UML类图可以让程序员快速的了解开发包中各个类的功能以及各个类之间的关系。

因为后面设计模式,都离不开UML类图进行解释说明,为避免有些博友对UML类图不是很清楚,本文详细讲解和梳理UML类图,并介绍通过为IDEA安装PlantUML Intergration插件实现UML类图的绘制,为后续设计模式的讲解做铺垫。本文所有代码都是以JAVA语言为例。

一、UML类图简介

统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。简单来说UML就是通过一系列规定好的符号,将复杂的文字表述转为清晰明了的符号关系图。

UML图分为三大类:

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

对于软件开发来说,最常用的就是UML类图,类图通过一系列规定好的符号对类与类之间的关系进行描述。

类图中类与类之间主要包括六大关系,描述这些关系的符号如下图所示。

二、类之间的六大关系及UML类图

1、依赖关系及UML类图表示

只要一个类用到了其它类,那这个类和其它类就构成了依赖关系。如A类中用到了B,C,D类,则A类就依赖于B,C,D类。

那么一个类如何算用到了其它类?有以下几种情况:

  1. 其它类作为该类的成员属性,这种情况下,如A类用到了B类的代码示例。
class A{private B b;
}
  1. 其它类作为该类中方法的接收参数类型,这种情况下,如A类用到了B类的代码示例。
class A{public void test(B b){//...}
}
  1. 其它类作为该类中方法的返回参数类型,这种情况下,如A类用到了B类的代码示例。
class A{public B test(){//...return null;}
}
  1. 其它类在该类的方法中使用到,这种情况下,如A类用到了B类的代码示例。
class A{public void test(){B b;System.out.println(b.toString());}
}

以上四种情况,都称作A类依赖于B类,UML类图中依赖关系由虚线加实心箭头表示,由依赖方指向被依赖方,A类依赖于B类的UML类图表示如下:

2、泛化关系及UML类图表示

泛化关系就是继承关系,它是继承关系的特例。如A类与B类之间是泛化关系,B类继承于A类,示例代码如下:

class B
{}class A extends B
{}

泛化关系也就是继承关系,在UML类图中由实线加空心箭头表示,由继承方指向被继承方,如A类继承自B类的UML类图表示如下:

3、实现关系及UML类图表示

实现关系就是指一个类对另一个接口的实现,它也是依赖关系的特例。如A类与B接口直接是实现关系,A类实现B接口的代码示例如下:

class A implements B
{}interface B
{}

实现关系在UML类图中由虚线加空心箭头表示,由实现方指向接口方,如A类实现B接口的UML类图表示如下:

4、关联关系及UML类图表示

关联关系是指类与类之间的联系,它也是依赖关系的特例。类与类之间的关联关系包括如下几种情况:

  1. 一对一,如一个人(Person)只能对应一个身份证(IDCard),而一个身份证只能对应一个人,代码示例如下:
class Person
{private IDCard idCard;//一个人对应一个身份证
}
class IDCard
{private Person person;//一个身份证对应一个人
}

关联关系在UML类图中是由实线加实心箭头表示,该案例在UML类图中的表达如下所示:

  1. 一对多,如一个教室(Classroom)可以包含多个学生(Student),代码示例如下:
class Classroom{List<Student> students;//一个教室可以包含多个学生
}class Student
{}

该案例在UML类图中的表达如下所示:

3. 多对多,如一个老师(Teacher)可以教多个学生(Student),而一个学生也可以有多个老师,示例代码如下:

class Teacher{private List<Student> students;//一个老师教多个学生
}class Student
{private List<Teacher> teachers;//一个学生有多个老师
}

该案例在UML类图中的表达如下所示:

5、聚合关系及UML类图表示

聚合关系表示的是整体与部分的关系,但整体与部分可以分开,整体没了,部分还存在。它是关联关系的特例,聚合关系一般通过set方法将部分注入到整体中
如一个电脑(Computer)有键盘(Keyboard),鼠标(Mouse)等组成,电脑坏了,不一定代码键盘和鼠标就不能用了。示例代码如下:

class Computer
{private Keyboard keyboard;private Mouse mouse;public void setKeyboard(Keyboard keyboard) {this.keyboard = keyboard;}public void setMouse(Mouse mouse) {this.mouse = mouse;}
}class Keyboard
{//...
}class Mouse
{//...
}

聚合关系在UML类图中由实线和空心菱形表示,由部分指向整体,该案例在UML类图中的表达如下所示:

6、组合关系及UML类图表示

组合关系表示的也是整体与部分的关系,但整体与部分不可分开,表现出同生共死的关系。它是关联关系的特例,组合关系一般在整体创建的时候就自动创建部分了
如一个人(Person)由头(Head)、手(Hand)、腿(Leg)等构成,一个人可以没有手和腿,但是一定不能没有头,因此人与头是组合关系,而人与手和腿是聚合关系,示例代码如下:

class Person
{private Head head=new Head();//与Person是组合关系,Person创建,则Head创建;Person销毁,则Head销毁;private Hand hand;//与Person是聚合关系private Leg leg;//与Person是聚合关系public void setHand(Hand hand) {this.hand = hand;}public void setLeg(Leg leg) {this.leg = leg;}
}
class Head
{}
class Hand
{}
class Leg
{}

组合关系在UML类图中由实线和实心菱形表示,由部分指向整体,该案例在UML类图中的表达如下所示:

三、如何绘制UML类图?

1. IDEA安装PlantUML Intergration插件

打开IDEA,点击File -> Settings,打开Settings窗口,选择Plugins,在搜索栏搜索PlantUML,点击PlantUML Intergration 后面的安装,完成插件安装,重启IDEA后,即可使用该插件。

2. PlantUML用法

  1. 选择一个包,右键选择New,然后点击PlantUML File
  2. 选择UML类图,并为之命名,创建一个UML类图文件
  3. UML类图文件由编辑区和视图区两部分组成,用户通过编辑区按照指定的语法编写代码,视图区自动根据语法绘制类图。通常我们新建完UML类图后,可以通过参考自动生成的代码及其对应的视图,学习常用的语法,然后,我们就可以将@startuml和@enduml之间的代码删除,然后根据自己的设计编写代码,绘制自己的类图。

    note:如果你的试图区不能正常显示,可以参考该文章:https://plantuml.com/graphviz-dot(包括Linux等各个平台的处理方法)
  4. 关于绘制UML类图的常见语法,下面进行详解讲解。

3. PlantUML绘制UML类图的常见语法

3.1 语法精髓

UML类图中最重要的就是绘制类与类之间的关系,每种关系有不同的图形元素连接,每种图形元素对应不同的语法,我总结出UML类图中涉及的图形元素及其对应的语法如下:

  1. 实线 对应语法是两个减号 “–”
  2. 虚线 对应语法是两个点 “…”
  3. 实心左箭头 对应语法是一个左括号 “<”
  4. 实心右箭头 对应语法是一个右括号 “>”
  5. 空心箭头 对应语法是一个左括号加竖线 “<|”
  6. 空心菱形 对应语法是字母o “o”
  7. 实心菱形 对应语法是符号* “*”

通过对以上图形语法的组合,即可绘制UML类图中所有的关系图形,如UML类图中依赖关系是通过虚线加空心箭头表达,那么对应的语法就是 <|…

3.2 绘制类与类之间的依赖关系语法

如A类依赖于B类,而UML类图中依赖关系是由虚线(…)加实心箭头(<)表示的,因此示例代码如下:

@startumlclass A{int a;
void fun1();
'可根据你类的设计补充相关的属性及方法,
'属性不带括号,方法带括号
}
class BB <.. A@enduml

3.3 绘制类与类之间的泛化关系语法

如A类继承于B类,而UML类图中泛化关系是由实线(–)加空心箭头(<|)表示的,因此示例代码如下:

@startumlclass A
class BB <|-- A@enduml

3.4 绘制类与类之间的实现关系语法

如A类实现接口B类,而UML类图中实现关系是由虚线(…)加空心箭头(<|)表示的,因此示例代码如下:

@startumlinterface A
class BA <|.. B@enduml

3.5 绘制类与类之间的关联关系语法

如A类和B类之间是一对一的关联关系,而UML类图中关联关系是由实线(–)加实心箭头(<)表示的,因此示例代码如下:

@startumlclass A
class B'通过在语法前的双引号中添加文字
'可以为线两端上添加注释
A "1"<..>"1" B@enduml

3.6 绘制类与类之间的聚合关系语法

如A类和B类之间是聚合关系,B聚合于A,而UML类图中聚合关系是由实线(–)加空心菱形(o)表示的,因此示例代码如下:

@startumlclass A
class B'通过在最后一个类后加冒号,
'冒号后面的文字可以添加带线中间显示
A o-- B:聚合@enduml

3.7 绘制类与类之间的组合关系语法

如A类和B类之间是组合关系,B组合于A,而UML类图中组合关系是由实线(–)加实心菱形(*)表示的,因此示例代码如下:

@startumlclass A
class BA *-- B@enduml

四、UML类图所有类之间关系及符号表示一览图

本文开篇我就放了这张图,如果您是从头看到现在,那么再看这张图,您就能发现它涵盖了本文的所有内容,图中包含了类之间的六种关系,每种关系的表达符号,每个符号的语法。

快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图相关推荐

  1. 一张图搞懂Spring bean的完整生命周期

    转载自 一张图搞懂Spring bean的完整生命周期 一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任 ...

  2. 一文多图搞懂KITTI数据集下载及解析

    转载自一文多图搞懂KITTI数据集下载及解析-阿里云开发者社区 KITTI Dataset 1.图片下载:点击下载:https://s3.eu-central-1.amazonaws.com/avg- ...

  3. 计算机控制的工作原理图,PLC工作原理动图,一图搞懂一个原理

    原标题:PLC工作原理动图,一图搞懂一个原理 PLC顺序控制 PLC正反转控制 按钮开关 冲孔加工 断电延时型时间继电器 多点控制 滚轮式行程开关 红绿灯 机械手 交流接触器 热继电器 三相闸刀 时间 ...

  4. 一图搞懂细粒度图像中的细粒度

    一图搞懂细粒度图像中的细粒度 前言 一.细粒度图像分类是什么? 二.细粒度图像分类难点? 前言 细粒度目的是对属于同一基础类别的图像进行更加细致的子类划分.例如区分野生鸟类.汽车等.由于类别之间具有细 ...

  5. java 原型图_一张图搞懂原型、原型对象、原型链

    基本概念 在javascript中,函数可以有属性. 每个函数都有一个特殊的属性叫作原型(prototype) 每个对象拥有一个原型对象 [[Prototype]] / __proto__ / Obj ...

  6. 电压和电流反馈判别及例子,绝对让你通透,其实也没有那么难,一次就看懂!从此终于搞懂了电压反馈和电流反馈!

    电压和电流反馈判别及例子,其实也没有那么难,绝对让你通透,一次就看懂!从此终于搞懂了电压反馈和电流反馈! 一个简单粗暴的判断方法: 先看反馈是否直接连到Uo输出端(若不是直接从输出端引出,则为电流反馈 ...

  7. 【科普干货】3张图搞懂Salesforce的认证体系(附新手考证攻略)

    Salesforce.com,这家神一般的公司及其产品我就不多说了,需要了解的可以阅读我的另一篇科普文章<一张图读懂Salesforce的产品架构>. 今天给大家带来另一篇关于Salesf ...

  8. 5张图搞懂Java深浅拷贝

    微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...

  9. 一张图搞懂clientWidth,offsetWidth,scrollHeight

    由于前端经常会遇到计算位置的问题,那么搞懂clientWidth,offsetWidth,scrollHeight等等这些就变得尤为重要.放上经典图,一张图让你搞懂clientWidth,offset ...

最新文章

  1. js监听audio播放完毕
  2. 目前中关村在线上面的CPU排行情况
  3. 深入Eureka/Feign/Hystrix原理学习(1)
  4. 分布式服务框架gRPC
  5. mysql 1021 disk full_大分区使用xfs文件系统存储备份遇到的问题
  6. 英特尔推出第二代神经拟态研究芯片Loihi 2和全新Lava软件框架
  7. Spring学习总结(14)——Spring10种常见异常解决方法
  8. Android:通过Intent传递对象、Parcelable
  9. Hadoop HDFS (3) JAVA訪问HDFS
  10. iPhone11因便宜销量超预期;三星手机曝高危漏洞;xUtils 3.8.3发布 | 极客头条
  11. vnr懒人版教程_凉皮懒人做法,不揉面不洗面,配方配料无保留,简单快速又好吃...
  12. 技术交底书(一)-----一种移动终端无需充电及移动终端
  13. python调用java的方法-JPype的简单使用
  14. matlab怎么算不定积分,matlab计算不定积分
  15. ei指什么_什么是EI?
  16. Android/Linux USB HID驱动(即USB鼠标USB键盘等驱动)相关文件
  17. Java机器人解密游戏_解谜类游戏 篇十:在机器人的世界中,那些隐藏在谜题之下的眼泪...
  18. Box Model 盒子模型 贷前数据查询 网贷多头借贷信息查询系统开发手机查询
  19. python妹子图爬虫5千张高清大图突破防盗链福利5千张福利高清大图
  20. 呼吸灯在哪里设置苹果_苹果前呼吸灯在哪里设置

热门文章

  1. JStorm和Storm比较
  2. OpenCV计划推出三代OAK相机
  3. leakcanary1.5源码分析
  4. 黄金斗士原生android,联想黄金斗士S8手机怎么样 黄金斗士S8真机评测详细图解
  5. you appear to be running an x server please exit x before installing
  6. 注册dll时返回0x80004005的解决方法
  7. vivado代码编写——倍频(使用IP核)
  8. python 内置浏览器robobrowser_【自动化测试】无需图形界面环境下的浏览器开源项目...
  9. [bzoj1925][DP]地精部落
  10. Zebra 打印机模板实现模板标签打印