谈到 UML 家族中的 类图,不得不说其本身包含的细节相对确实有点多,并且你在网上看总能找到一些看似同属于类图,却又有点细微差别的表示方法,似乎各有各家的章法,它们之中要么就是结尾少个箭头,要么就是实线变成虚线,让人摸不着头脑 …
那到底什么是类图 ?类图怎么画 ?有没有一个标准呢? 别慌,从广义上来说其实是有的,你也可以参考设计模式相关书籍中对类图的详细介绍。 因为经历过上述的困扰和摸索,为方便大家学习也为方便自己记忆,在这里我特意提炼总结了一下,并将其 划分成了 两个学习部分,分别是 —— 主要掌握 和 次要掌握 , 在坐的吃瓜群众切莫急躁, 相信我认真看完下文,以后不会再对类图有任何疑问 ~~~
类图概括起来主要由两部分组成 —— 类、类之间的关系, 其中对类的定义如上图所示, 主要由三部分组成, 它们是 类名、 类的属性(成员变量)、 类的相关操作(函数方法) , 分别对应图里的 上中下 三个分区内容。
[ 符号解释 ]
冒号前是方法名/变量名(根据有无括号区分),冒号后是返回参数/变量类型(根据有无括号区分),如果没有冒号的话表示方法返回空(也有人通过:void表示返空)
网上标准解释: 泛化关系为 is-a 的关系;两个对象之间如果可以用 is-a 来表示,就是泛化关系 。
笔者通俗解释: Mac is a 电脑,懂了吧 ? 也就是说Mac 继承 了电脑,是电脑的子类 。
总结: 空心三角 + 实线 (也有乱画成实心表示的,你反正记住这个 形状+ 实线 就行)== 继承关系
笔者通俗解释: 继承 抽象类 和 实现 接口 都属于实现关系 。 需要特别注意的是实现关系有种 "棒棒糖" 表示法,就是被实现的那个对象是用圆形表示的(这个在下面巩固栏目里会说明)。
总结: 空心三角 + 虚线(也有乱画成实心表示的,你反正记住这个 形状+ 虚线 就行) == 实现关系
【 次要需掌握的 】
网上标准解释: 通常用一条直线表示,当然 如果需要标明方向 可以添加箭头。它是描书不同的类对象之间的关系,通常不会随着状态的变化而变化,可以理解为被关联者属于关联者的一部分。
笔者通俗解释: 其实就是一个类中的 对象与对象 之间的引用关系,你可以理解为一个类中的 所有 成员变量。
当然如果是多对多关系(比如一个类中的成员变量含有另一个对象的List, 另一个类的成员变量又含有当前对象的List), 那么就可以不用箭头表示, 也可以用双向箭头表示 —— 另外也有完 【全不用箭头】 表示,就是简单 【一条直线】 结合 【两头的数量符号】 来标识关系。
总结: 尖括号 + 实线 == 关联关系
网上标准解释: 与聚合关系一样,组合关系同样表示整体由部分构成的关系,不同之处在于整体和部分是强依赖关系,如果整体不存在了,部分也不复存在。
笔者通俗解释: 你可以理解为 非集合类的成员变量, 它与类共存亡 —— 比如这里的 部门 不能脱离 公司 独自存在(别跟我杠,我们这里讨论的是名词,你要想独自存在,不如干脆叫自己为叛徒小公司吧)总之 —— 公司亡,部门必亡 ~
总结: 实心 棱形 + 实线 == 组合关系
网上标准解释: 与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在。
笔者通俗解释: 你可以理解为 集合类的成员变量, 集合类中聚合的对象就代表了这层聚合关系 。 如 List<码农> ,这个集合中 聚合 的 “码农” 对象是可有可无的, 他不影响自身, 二者各自的存活时长完全独立 ,这就是聚合关系 。
总结: 空心 棱形 + 实线 == 聚合关系
网上标准解释: 通常描述一个对象在运行期间会用到另一个对象的关系。
笔者通俗解释: 当一个对象依赖另一个对象提供的服务时,就是依赖关系 。 函数方法的入参 、 局部变量的引用 、 静态方法的直接调用 都属于这个范畴 。 一个对象中的函数方法依赖另一个对象作为实例入参的表现形式最为常见, 拿函数方法举例 —— 比如 A 函数方法的入参实例 B,就是需要依赖过来的调用对象。
总结: 尖括号 + 虚线 == 依赖关系
在这里也对描述关联关系的绘画给出最佳建议: 1.用对应箭头标明关系的方向 2.标明数量符号 3.在关系线的上面写清楚你对这段关系的核心解释 4.如果有必要的话 —— 在关系指向的尽头标明对这个这个目标类的职责描述(这个类是干什么的)5.不管是对关系的额外注释还是对类的额外注释 —— 如果内容很多的话,建议写在一个 Note(注释图标) 里,并用虚线链接
数量符号 (Multiplicity) :
0..1(0至1)、 n(规定数量) 、 0..* (0至多) 、 1..* (1至多)、 m..n(规定的数量区间) 比如一头是 1,而另一头是 1 … * —— 那它的意思就是 “1” 对 “多”,且这个“多”最少为一个
总结:
如果你能理解下图,那基本上说明你已经把 [ UML-类图 ] 弄懂了,再去多结合一些代码和对应的类图巩固一下,以后再看到类图就不会懵圈圈了 ~
图中的意思概括就是:
一个 公司 中可以有多个 部门 —— 非集合类的成员变量(公司亡,部门必亡)
一个 部门 中可以有多个 码农 —— 集合类成员变量,如 List<码农>(码农可有可无,没了换掉就是了,不影响部门的存活)
一个 码农 可以有多个 手机 —— 成员变量
一个 码农 依赖多个 Mac —— 很简单,有了 Mac 我才能敲代码嘛,可以理解为需要 Mac 来完成自身的方法调用
Mac 是 电脑 的一种拓展 —— 继承关系
电脑 是 可处理计算机 这个概念的一种实现 —— 实现关系
上面几乎把该有的标准都列举出来了,但你依然能在网上看到除上述展现形式之外的其他各种五花八门 又 看似熟悉 的类图展现形式,它们要么就是没标明箭头,要么就是线条对不上 …
万变不离其宗,尽管其标识没有表示清楚,但在绝大多数情况下还是会留有注释的,只要你理解了,并把上面的 类图基础属性 记牢, 结合图里留下的 中/英文注释 一定能看懂。 OK,话不多说,下面再列出一些类图的例子,供大家巩固学习 ~ ~
[ 举例巩固 - 类定义 ]
上面的 MyClass 中说明了如下内容(这里只做举例概述,其他细节结合 类图基础属性 内容思考得出):
一个叫做 Myclass 的类中,定义了 三个成员变量 和 三个函数方法
私有方法 op2 的形参 p3 是 int 类型
私有方法 op2 返回的结果 是 float 类型
受保护方法 op3 返回的结果 是 自定义的 Class6 类型
[ 举例巩固 - 关系定义 ]
[ 依赖关系 ]