架构师必须学会的UML图小结
一、 UML 是什么
定义
UML 是统一建模语言, 是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。
UML 本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他 们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等。
作用
- 帮组开发团队以一种可视化的方式理解系统的功能需求。
- 有利于开发团队队员之间在各个开发环节间确立沟通的标准,便于系统文档的制定和项目的管理。因为 UML 的简单、直观和标准性,在一个团队中用 UML 来交流比用文字说明的文档要好的多。
- UML 为非专业编程人士理解软件的功能和构造,提供了一种直白、简单、通俗的方法。
- 使用 UML 可以方便的理解各种框架的设计方式。
二、 UML 画图的工具推荐
- MarkDown
- PlantUML
- Draw.io (Mac)
- PowerDesigner (Windows)
工作中第一个常用用来写文档,二三个用来画UML图比较多(推荐结合使用)。
只要掌握常用的几种图 (用例图、类图、时序图、活动图) ,就已经迈向架构第一步了,工作学习中交流起来就容易多了。
三、UML 类图中的关系
在 UML 类图中,常见的有以下几种关系:
- 泛化(Generalization)(继承)
- 实现(Realization)
- 关联(Association)
- 聚合(Aggregation)
- 组合(Composition)
- 依赖(Dependency)
他们的强弱级别为:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
UML 类与类之间的关系表示总览:
以下 UML 图用的是 Draw.io 来画的,开源地址:https://github.com/jgraph/drawio
1. 泛化(继承)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
【例如】:男人是人的一种,既有男人的特性也有人的共性。女人也是如此。
【箭头指向】:带三角箭头的实线,箭头指向父类。
2. 实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。
【例如】:USB 是一个接口,每一个电脑都可以插上 USB 这个接口。
【箭头指向】:带三角箭头的虚线,箭头指向接口。
3. 关联(Association)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。
【例如】:老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西,他不拥有学生。
【代码体现】:成员变量。
【箭头及指向】:双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
4. 聚合(Aggregation)
【聚合关系】:是整体与部分的关系,可以看成 「has-a」 的关系,部分可以离开整体而单独存在。
【例如】:电脑和键盘是整体和部分的关系,电脑没了键盘仍然可以存在。
【代码体现】:成员变量。
【箭头及指向】:带空心菱形的实心线,菱形指向整体。
5. 组合(Composition)
聚合关系】:是整体与部分的关系,可以看成 「contains-a」 的关系,部分离开整体后无法单独存在。
【例如】:鸟儿和翅膀是整体和部分的关系,鸟儿没了翅膀不能独立存在。
【代码体现】:成员变量。
【箭头及指向】:带实心菱形的实心线,菱形指向整体。
6. 依赖(Dependency)
【聚合关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。
【例如】:人依赖计算机实现玩电脑游戏的目的。
【代码体现】:局部变量、方法的参数或者对静态方法的调用。
【箭头及指向】:带箭头的虚线,指向被使用者。
如果要画项目的设计图,有很多类的关系图,这个软件可以使用。如果需要快速在设计某个功能时也可以使用 PlantUML 来实现,怎么快怎么来。
可以在网页上画,在 IDE中也有插件 :
比如我在总结设计模式系列时,就用这个来画。
用代码来直接渲染生成UML 设计图片
代码如下:
@startuml
skinparam classAttributeIconSize 0
package "class ChainOfResponsibility(责任链模式)" {
abstract class Handler
{
#setSuccessor(Handler)
+handle():void
}
note left: 抽象处理者
class HandlerA
{
+handle():void
}
class HandlerB
{
+handle():void
}
class HandlerC
{
+handle():void
}
Handler o-- Handler:0..1
Handler <|-- HandlerA
Handler <|-- HandlerB
Handler <|-- HandlerC
Client ..> Handler
}
@enduml
生成的效果图:
四、小结
UML 是每一个软件开发者都必须要熟练掌握的,如何你还不会,赶紧学习(卷)起来吧。
参考资料:
Android实用技能指南
Android开发一枚,专注分享工作中用到的技术总结,欢迎交流。 CSDN 博客:[链接]
推荐阅读
「持续兼容」微信H5选择照片(图片&视频)及拍照&录像
做过H5调用手机相册或者拍照的同学可能深有体会,在不同型号手机和不同的浏览器上表现各有差异,实属头疼。由于手机自带浏览器或者第三方浏览器实在太多,结合最近正在做的项目用户群体P90在微信上,文本单从兼容...
wuwhs赞 6阅读 2.4k
网易云音乐开源全链路埋点方案-曙光埋点(dawn)
网易云音乐开源了曙光埋点 dawn,一个跨多端的全链路埋点解决方案,旨在构造一个完美的数据理想国。曙光埋点创造性的提出了埋点虚拟树(VTree),并在此基础上实现了诸多能力,解决大前端侧埋点困难、精度差、不...
云音乐技术团队赞 3阅读 2.4k
直播回顾 | 点击率提升400%,Ta是怎么做到的?
Discovery第18期直播已于3月30日圆满结束,本期直播邀请天眼查做客直播间,从天眼查与华为Push用户增长服务合作历程切入,聚焦用户增长,分享提升应用活跃度和渠道ROI的经验与见解。一起来回顾本期精彩内容吧!
HMSCore阅读 6.3k
Android Crash 前的最后抢救
众所周知,当 Andoird 程序发生未捕获的异常的时候,程序会直接 Crash 退出。而所谓安全气囊,是指在 Crash 发生时捕获异常,然后触发兜底逻辑,在程序退出前做最后的抢救。
xiangzhihong赞 1阅读 1.3k
教你如何在 Andorid 上使用OpenAI API 调用ChatGpt
现在Chat GPT功能越来越强了,几乎你想问实际问题它都能给你回答。正好,小组结课的 Android项目 有一个解梦的功能。正好调用chatGpt的Api来实现。下面就来简单实现在Andorid项目中打造一个简易的聊天机器人。
weiweiyi赞 1阅读 979
Linux下编译WebRTC(Linux和Android版本)
随着新冠疫情的影响,这两年音视频的需求呈爆发式增长。在音视频领域中,WebRTC可以说是一个绕不开宝库,包括了音视频采集、编解码、传输、渲染的全过程。本文主要记录下在Linux平台上编译WebRTC Linux和Android...
吴尼玛阅读 3.3k评论 2
一名七年老安卓的一二月小结
你好,我是 shixin,一名工作七年的安卓开发。每两个月我会做一次总结,记下这段时间里有意义的事和值得反复看的内容,为的是留一些回忆、评估自己的行为、沉淀有价值的信息。一转眼 2023 年过去了六分之一,这两...
shixinzhang赞 2阅读 720
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。