UML 学习笔记
![UML学习笔记](https://static001.geekbang.org/infoq/21/21547eb4056235ffc26c9bfaa5464318.jpeg)
前言
相信很多开发同学对UML 图并不陌生。
为什么突然会写这么一篇八杆子打不着的内容呢?是因为肥壕在写 RocketMQ 源码解析系列的过程中,发现需要有一些图来更好的表达源码中的结构和调用关系。
平时我们可能看到最多的用例图、类图。本着深入学习,全面发展
的宗旨,肥壕简单梳理了一下平时常见的 9 种 UML 图。
正文
9 种常见的 UML 图有:
用例图
类图
对象图
序列图
协作图
状态图
活动图
构件图
部署图
用例图
从用户的角度描述了系统的功能,描述用户与系统用例之间的关系。简单说来,就是用户用这个系统可以做什么东西!
用例图中涉及的关系:
![](https://static001.geekbang.org/infoq/db/dbda5fe0c0b8aa5839de9b1848b46480.png)
参考例子:
![](https://static001.geekbang.org/infoq/58/58064c2ccf200b2fc97fd3a7c988ee4a.png)
类图
用户根据用例图抽象成类,描述类的内部结构和类的属性与类之间的关系,是一种静态结构图。
在UML类图中,常见的有以下几种关系:
泛化(Generalization)
实现(Realization)
关联(Association)
聚合(Aggregation)
组合(Composition)
依赖(Dependency)
各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
泛化
是一种继承关系,表示子类继承父类的所有特征和行为。
![](https://static001.geekbang.org/infoq/c9/c959235a6ca55c7ae21b1302be95d40d.png)
实现
是一种类与接口的关系,表示类是接口所有特征和行为的实现。
![](https://static001.geekbang.org/infoq/21/2188d2873c8bc3fed0a6d85e8909b2e4.png)
关联
是一种拥有关系,它使得一个类知道另一个类的属性和方法。
如:老师与学生是双向关联,老师下有多名学生,学生也能对应多个老师;但是一个学生只能与多个课程关联
双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头
![](https://static001.geekbang.org/infoq/ea/ea7b7156abb3587dc633217312bcbcba.png)
聚合
是一种整体与部分的关系。且部分可以离开整体而单独存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
![](https://static001.geekbang.org/infoq/64/6408f03f48421d89a828d4ea7bce7c2d.png)
组合
是一种整体与部分的关系。但部分不能离开整体而单独存在,组合关系是关联关系的一种,是比聚合关系还要强的关系。
如公司和部门是整体和部分的关系,没有公司就不存在部门。
它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
![](https://static001.geekbang.org/infoq/38/386ed480bd5a33e0023302126a167db4.png)
依赖
是一种使用关系,即一个类的实现需要另一个类的协助。
![](https://static001.geekbang.org/infoq/77/7709fd87f9f2ac2cc846a1c4f52e9747.png)
简单概括上面的关系和对应的符号:
![](https://static001.geekbang.org/infoq/91/91d1a8452be9210d62f1c72217c0e61e.png)
对象图
描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以被看作是类图在某一时刻的实例。
例如:在某个时间点 bat 公司的研发部门和销售部门,只能有一个人 edison
![](https://static001.geekbang.org/infoq/72/72e792a291404165acd57f5549d4f16b.png)
状态图
是一种由状态、变迁、事件和活动组成的状态机,用来描述类的对象所有可能的状态以及时间发生时状态的转移条件。
状态机由状态、转换、事件、活动和动作五部分组成
状态
转换
事件
活动
动作
![](https://static001.geekbang.org/infoq/d1/d1545644cdfb344f5346021ed6cb7027.png)
活动图
是状态图的一种特殊情况,这些状态大都处于活动状态。本质是一种流程图,它描述了活动到活动的控制流。
交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流。
活动图是一种表述过程基理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
活动图组成元素:动作和活动节点、开始和终止、控制流、判断节点、合并节点、泳道。
![](https://static001.geekbang.org/infoq/c3/c339c3899932d23c31a6458053ab5bc6.png)
直接上例子:
![](https://static001.geekbang.org/infoq/ef/efa172fae562a7c6ad379ff7e83a8b3c.png)
序列图
也称为时序图,描述了对象之间消息发送的先后顺序,强调时间顺序。这个也是肥壕平时画得比较多的一种,因为它不仅绘画简单,而且也表达直观明了。
肥壕这里就不多赘述,直接放上 Dubbo 暴露服务的时序图:
![](https://static001.geekbang.org/infoq/b8/b8fd06cdaa2ea64019ea8dc4f0f976fd.png)
协作图
交互图的一种,描述了收发消息的对象的组织关系,强调对象之间的合作关系。时序图按照时间顺序布图,而协作图按照空间结构布图
![](https://static001.geekbang.org/infoq/35/354609b6f2c084dfeb34da470dea5561.png)
构件图
构件图是用来表示系统中构件与构件之间,类或接口与构件之间的关系图。其中,构建图之间的关系表现为依赖关系,定义的类或接口与类之间的关系表现为依赖关系或实现关系。
构件图中的事物
![](https://static001.geekbang.org/infoq/e8/e8edc95c497efcf0a8dd2c82756ddf29.png)
构件图中的关系
![](https://static001.geekbang.org/infoq/d2/d2079eedc57e123e1df7422275224204.png)
部署图
描述了系统运行时进行处理的结点以及在结点上活动的构件的配置。强调了物理设备以及之间的连接关系。
部署模型的目的:
描述一个具体应用的主要部署结构,通过对各种硬件,在硬件中的软件以及各种连接协议的显示,可以很好的描述系统是如何部署的;平衡系统运行时的计算资源分布;可以通过连接描述组织的硬件网络结构或者是嵌入式系统等具有多种硬件和软件相关的系统运行模型。
![](https://static001.geekbang.org/infoq/95/9559a9563b80b4d00fa24595332e5d82.png)
来源:https://www.processon.com/view/5ee37ba0f346fb1ae55ed3dc?fromnew=1
小结
常见的 UML 图大概就简单概述了一遍,肥壕常用的话就可能是用例图、类图、时序图这几个吧。其他用得比较少也没怎么详细介绍和笔记,日后如果用到了再补充吧。这次的笔记目的主要也是肥壕为了更好的写出 RocketMQ 源码系列的篇章,当然如果大家能够熟练各种 UML 图,对于个人的来说也是有一定的帮助和成长的。
普通的改变,将改变普通
我是肥壕,一个在互联网低调前行的小青年
欢迎关注我的博客📖 edisonz.cn,查看更多分享文章
评论