[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一

Posted 削尖的螺丝刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一相关的知识,希望对你有一定的参考价值。

 
 
 

统一建模语言(Unified Modeling Language,UML) 可分类成:
 

  • 功能模型:从用户的角度展示系统的功能,包括用例图。
  • 对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
  • 动态模型:展现系统的内部行为。包括序列图,活动图,状态图。
     
                                            ——本文将带您深入浅出,详细透彻的了解类图

 
 
 
 

类图


 
 
 
 
 

 
   谈到 UML 家族中的 类图,不得不说其本身包含的细节相对确实有点多,并且你在网上看总能找到一些看似同属于类图,却又有点细微差别的表示方法,似乎各有各家的章法,它们之中要么就是结尾少个箭头,要么就是实线变成虚线,让人摸不着头脑 …
 
    那到底什么是类图 ?类图怎么画 ?有没有一个标准呢? 别慌,从广义上来说其实是有的,你也可以参考类似《大话设计模式》书中对类图的详细介绍。 因为经历过上述的困扰和摸索,为方便大家学习也为方便自己记忆,在这里我特意提炼总结了一下,并将其 划分成了 两个学习部分,分别是 —— 主要掌握 和 次要掌握 , 在坐的吃瓜群众切莫急躁, 相信我认真看完下文,以后不会再对类图有任何疑问 ~~~ 🦄​
 

 
 
 
 
 
 
 

【 主要需掌握的 】

  1. 类图基础属性

 
 
 
 
 
 
 

 
 
 
 
 
 

    类图概括起来主要由两部分组成 —— 类之间的关系, 其中对类的定义如上图所示, 主要由三部分组成, 它们是 类名、 类的属性(成员变量)、 类的相关操作(函数方法) , 分别对应图里的 上中下 三个分区内容。

 
 
 
 

[ 符号解释 ]

  • -: private
  • +: public
  • ~: default
  • #: protected
  • 下划线: static
  • 斜体: 抽象 (注意也可以用两个尖括号包裹来表示抽象,比如 —— <<我是抽象类or接口>>)
  • 冒号前是方法名/变量名(根据有无括号区分),冒号后是返回参数/变量类型(根据有无括号区分),如果没有冒号的话表示方法返回空(也有人通过:void表示返空)

 
 
 
 
 

2. 泛化关系(你可以理解为继承)

 
 


 
网上标准解释: 泛化关系为 is-a 的关系;两个对象之间如果可以用 is-a 来表示,就是泛化关系 。

笔者通俗解释: Mac is a 电脑,懂了吧 ? 也就是说Mac 继承 了电脑,是电脑的子类 。

总结: 空心(也有实心表示的,你反正记住这个形状就行)三角 + 实线 == 继承关系

 
 
 
 
 
 

3. 实现关系


 
网上标准解释: 程序里面实现关系表现为继承抽象类 。

笔者通俗解释: 继承 抽象类实现 接口 都属于实现关系 。 需要特别注意的是实现关系有种 "棒棒糖" 表示法,就是被实现的那个对象是用圆形表示的(这个在下面巩固栏目里会说明)。

总结: 空心(也有实心表示的,你反正记住这个形状就行)三角 + 虚线 == 实现关系

 
 
 
 
 
 
 

【 次要需掌握的 】

 

1. 关联关系


 
网上标准解释: 通常用一条直线表示,当然 如果需要标明方向 可以添加箭头。它是描书不同的类对象之间的关系,通常不会随着状态的变化而变化,可以理解为被关联者属于关联者的一部分。
 
笔者通俗解释: 其实就是一个类中的 对象与对象 之间的引用关系,你可以理解为一个类中的 所有 成员变量当然如果是多对多关系(比如一个类中的成员变量含有另一个对象的List, 另一个类的成员变量又含有当前对象的List), 那么就可以不用箭头表示, 也可以用双向箭头表示。
 

总结: 尖括号 + 实线 == 关联关系

 
 
 
 
 
 

1. 1 组合关系(组合关系是关联关系的一种,属于强关联关系)


 
网上标准解释: 与聚合关系一样,组合关系同样表示整体由部分构成的关系,不同之处在于整体和部分是强依赖关系,如果整体不存在了,部分也不复存在。
 
笔者通俗解释: 你可以直接理解为 非集合类的成员变量, 它与类共存亡 。
 

需要另外注意的是,组合关系可特殊标明 0..1(0至1)、 n(规定数量) 、 0..* (0至多) 、 1..* (1至多)、 m..n(规定的数量区间)。 比如棱形一头是 1,而另一头是 1 … * —— 那它的意思就是 “1” 对 “多”,且这个“多”最少为一个。

 
总结: 实心 棱形 + 实线 == 组合关系

 
 
 
 
 
 
 

1. 2 聚合关系( 聚合关系也是关联关系的一种,属于弱关联关系 )


 
网上标准解释: 与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在。
 
笔者通俗解释: 你可以理解为 集合类的成员变量, 集合类中聚合的对象就代表了这层聚合关系 。 如 List<码农> ,这个集合中 聚合 的 “码农” 对象是可有可无的, 他不影响自身, 这就是聚合关系 。
 
总结: 空心 棱形 + 实线 == 聚合关系

 
 
 
 
 
 

2. 依赖关系


 
网上标准解释: 通常描述一个对象在运行期间会用到另一个对象的关系。
 
笔者通俗解释: 当一个对象依赖另一个对象提供的服务时,就是依赖关系 。 函数方法的入参 局部变量的引用 静态方法的直接调用 都属于这个范畴 。 一个对象中的函数方法依赖另一个对象作为实例入参的表现形式最为常见, 拿函数方法举例 —— 比如 A 函数方法的入参实例 B,就是需要依赖过来的调用对象。
 
总结: 尖括号 + 虚线 == 依赖关系

 
 
 
 
 
 

总结:


   如果你能理解下图,那基本上说明你已经把 [ UML-类图 ] 弄懂了,再去多结合一些代码和对应的类图巩固一下,以后再看到类图就不会懵圈圈了 ~

 
 
 
 
 

 
 
 
 
 
 
 

图中的意思概括就是:

  1. 一个 公司 中可以有多个 部门 —— 非集合类的成员变量(公司亡,部门必亡)
  2. 一个 部门 中可以有多个 码农 —— 集合类成员变量,如 List<码农>(码农可有可无,没了换掉就是了,不影响部门的存活)
  3. 一个 码农 可以有多个 手机 —— 成员变量
  4. 一个 码农 依赖多个 Mac —— 很简单,有了 Mac 我才能敲代码嘛,可以理解为需要 Mac 来完成自身的方法调用
  5. Mac电脑 的一种拓展 —— 继承关系
  6. 电脑可处理计算机 这个概念的一种实现 —— 实现关系

 
 
 
 
 

 

巩固


 
 
 
 
 

 

   上面几乎把该有的标准都列举出来了,但你依然能在网上看到除上述展现形式之外的其他各种五花八门 又 看似熟悉 的类图展现形式,它们要么就是没标明箭头,要么就是线条对不上 …
 
 

    万变不离其宗,尽管其标识没有表示清楚,但在绝大多数情况下还是会留有注释的,只要你理解了,并把上面的 类图基础属性 记牢, 结合图里留下的 中/英文注释 一定能看懂。 OK,话不多说,下面再列出一些类图的例子,供大家巩固学习  ~ ~
 

 
 
 
 
 
 

[ 举例巩固 - 类定义 ]

 


 

上面的 MyClass 中说明了如下内容(这里只做举例概述,其他细节结合 类图基础属性 内容思考得出):

  • 一个叫做 Myclass 的类中,定义了 三个成员变量三个函数方法
  • 私有方法 op2形参 p3int 类型
  • 私有方法 op2 返回的结果float 类型
  • 受保护方法 op3 返回的结果自定义的 Class6 类型

 
 
 
 
 
 
 
 

[ 举例巩固 - 关系定义 ]
 
 


 

[ 依赖关系 ]

 
 
 
 
 
 
 
 
 

[ 关联关系 ]

 
 
 
 
 
 
 
 
 

 

[ 聚合关系 ]

 
 
 
 
 
 
 
 
 

 

[ 组合关系 ]

 
 
 
 
 
 
 
 
 

 

[ 标明对应数量的组合关系 ]

 
 
 
 
 
 
 
 
 

 

[ 泛化(继承)关系 ]

 
 
 
 
 
 
 
 
 
 


 

[ 实现关系 —— 棒棒糖表示法 ]

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

   如果你通过上面的内容,自认为对类图有了一个更加深入的理解,那么可以抓住这个记忆点挑战一下自己。借助对类图的巩固理解,通过这篇文章 —— 【彻底搞懂建造者模式】, 进一步获取对 设计模式 方面思想和能力的提升 !!!

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🎏 你学废了吗? 如果有帮助欢迎点赞收藏 ~
 


 
 
 
 
 
 
​🍹​ 另外如果觉得在 灵魂画手 这条路上走的还不过瘾,这里再额外送您两张机票:
 
【程序员必备画图技能之 —— 时序图介绍】 ✈️​

【程序员必备画图技能之 —— 流程图介绍】 ✈️​
 
 
 
 
 
 


 
 
 
 
参考资料:

 
https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-uml/
 
https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-class-diagram/
 
https://www.javatpoint.com/uml-class-diagram
 
https://www.jianshu.com/p/57620b762160
 
https://baike.baidu.com/item/%E7%B1%BB%E5%9B%BE/4670826?fr=aladdin
 
https://www.bilibili.com/video/BV1ct411U7hk
 
https://www.geeksforgeeks.org/unified-modeling-language-uml-introduction/
 
https://creately.com/blog/diagrams/class-diagram-tutorial/
 
http://c.biancheng.net/view/1319.html
 
https://creately.com/blog/examples/class-diagram-templates/
 
https://creately.com/blog/diagrams/class-diagram-relationships/
 
https://csdnnews.blog.csdn.net/article/details/89838014?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs
注: 该篇文章中的图有明显错误,笔者已通过PS手段在当前博文修正过来

 
 
 

以上是关于[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一的主要内容,如果未能解决你的问题,请参考以下文章

[UML] 时序图介绍 —— 程序员(灵魂画手)必备画图技能之一

[UML] 流程图介绍 —— 程序员(灵魂画手)必备画图技能之一

[ 设计模式 ] 彻底搞懂建造者模式 —— 全网最透彻理解

[ 设计模式 ] 彻底搞懂建造者模式(生成器模式) —— 透彻理解

[ 设计模式 ] 彻底搞懂建造者模式(生成器模式) —— 透彻理解

程序员必备UML类图的画法