系列文章目录
移动端UML图应用之UML图简述
移动端UML图应用之UML行为图——用例图、活动图和状态机图
移动端UML图应用之UML交互图——顺序图和通信图
移动端UML图应用之UML结构图——包图、部署图和组件图
移动端UML图应用之UML结构图——类图
前言
UML用类图描述系统中的类,以及存在于他们之间的各种静态关系。类图用于静态对象建模。可以用一幅图概括(和理解)大部分常用类图表示法。下图中的大部分元素都是可选的(例如,+/-可见性、参数、分栏)。
一、属性
表示方式
可以用以下方式表示类元的属性:属性文本表示法、关联线表示法、两者兼有。
下图展示了这三种表示法:
属性文本表示法的完整格式:
visibility name: type multiplicity = ``default` `{property-string}
- visibility —— 公开(+) / 私有 (-)
- type —— 属性类型
- multiplicity —— 多重性
- default —— 建期间没有指定值时新创建对象的值
- {property-string} —— 特性字符串,允许附加的属性性质
准则:对原始类型的数据,或者读者一目了然的类型的数据使用属性文本表示法,对其他对象使用关联线。两者的语义是等价的,但在图中展示与另一个类框的关联线能够在视觉上强调图中对象的类之间的连接。常见的原始类型的数据有:布尔、数字、字符、字符串(文本)、枚举类型等。
可见性
'+'表示 public,公开的
'-'表示 private,私有的
'~'表示 package,包 —— 不建议使用
'#'表示 protected,保护的 —— 不建议使用
多重性
多重性定义了类A有多少个实例可以和类B的一个实例关联,下图给出一些多重性表达式的例子:
二、操作
完整定义形式 —— visibility name (parameter-list) : return-type {property-string}
- visibility —— 公开(+) / 私有 (-)
- parameter-list 是操作的参数列表。
- return-type 是返回值的类型,如果有的话。
- property-string 指应用到给定操作的性质的值,可以包含任何附加信息
操作不是方法。方法是实现,操作是声明,其中包含名称、参数、返回类型、可能的前置和后置条件约束等。
访问属性的操作
访问操作是提取或设置属性的操作,例如,getPrice和setPrice。这些操作通常不包含在类图中,因为它们产生了较高的干扰价值比(noise-to-value ratio);对于n个属性,可能会有2n个令人厌倦的getter和setter操作。大多数UML工具支持对其显示的过滤,而在墙上画草图时往往会忽略这些操作。
摘自《UML和模式应用》
三、关系
UML中的四个关系 —— 泛化、实现、关联、依赖
泛化
UML对泛化的定义如下:泛化——普通的类元与特殊的类元之间的分类学关系。特殊类元的每个实例也是普通类元的间接实例。因此,特殊类元间接地拥有了普通的类元的特性。
我们一般用来表示父类和子类之间的继承关系,在图上,使用【空心三角+实线】来表示。
实现
我们一般用来表示接口/抽象类和具体类之间的实现关系,在图上,使用【空心三角+虚线】来表示。
关联
表示类与类之间的连接,使得一个类知道另一个类的属性和方法,方向可以是单向,也可以是双向的,用来表示比较强的、长期的关系。在图上,使用【实线箭头】来表示,如下图人与氧气的关系。
代码体现:
1)B 作为 A 的属性出现在 A 中;
2)关联类A 引用了 被关联类B 的全局变量;
依赖
表示类与类之间的联系,是的一个类依赖于另一个类的定义,方向是单项的,用来表示比较弱的、临时的关系。在图上,使用【虚线箭头】来表示,如上图人与筷子的关系。
代码体现:
1)A方法的参数是B (耦合);
2)A方法的参数是B的属性(紧耦合);
3)A方法中实例化了B;
4)A方法的返回值是B;
注意:尝试展示类图中的所有依赖是吃力不讨好的;因为有太多依赖而且改变太频繁。只有当依赖直接和你要沟通的特定主题相关时,才有选择地展示它们。
特殊的关联关系
聚合和组合是两种特殊的关联关系。
聚合(aggregation)是UML中一种模糊的关联,其不精确地暗示了整体-部分关系(和许多普通关联一样)。虽然在UML中并没有刻意区分聚合与纯关联的语义,但是UML还是定义了这一术语。为什么?可以参考Rumbaugh(UML的创建者之一)的话:“虽然并没有给聚合赋予太多的语义,但是每个人(基于不同理由)都认为这是必要的。可以将其视为建模的安慰剂。”
准则:因此,听从UML创建者的建议,不要在UML中费心去使用聚合。相反,在适当的时候要使用组合。
摘自《UML和模式应用》
聚合
关联关系中的一个特例,此时,整体和部分是分离的,有各自的生命周期,个人理解,两个对象是可以分开实例化,然后通过相互引用,形成的关联关系。在图上,使用【空心菱形箭头】来表示。
组合
关联关系中的一个特例,此时,整体和部分是不分离的,组合关系,必须满足 “独占/无分享” 规则,个人理解,两个对象是同时实例化的,在实例化的时候,就已经完成相互引用,形成的关联关系。在图上,使用【实心菱形箭头】表示。
四、其他
注解符号
UML注解符号显示为摺角矩形,并使用虚线连接到要注解的元素上。注解符号可以表示多种事物,例如:
- UML注解或注释
- 定义方法体
- UML约束,必须使用“{…}”将它括起来(详见4.3图)
关键词
关键字 | 含义 | 用法示例 |
---|---|---|
《actor》 | 类元为参与者 | 在类图中,置于类元名称之上 |
《interface》 | 类元为接口 | 在类图中,置于类元名称之上 |
{abstract} | 抽象元素;不能实例化 | 在类图中,置于类元名称或操作名称之后 |
{ordered} | 具有强制顺序的一组对象 | 在类图中,置于关联的端点 |
约束
约束以花括号之间的文本表示,例如{size>=0}。其中的文本可以是自然语言或其他语言。显示约束的三种方式如下图:
特性字符串
用来表示元素的特性。采用{name1=value1, name2=value2}的形式,例如{abstract, visibility=public}。有些特性没有值,例如{abstract},这通常表示布尔类型的特性,是{abstract=true}的简写。注意,{abstract}既是约束,也是特性字符串。
另外,只读可表示为 {readOnly};冻结(不可变),可表示为 {frozen} 、 {final}。
单实例类
单实例类的含义是类实例化后只存在一个实例,永远不会有第二个。在UML图中,可以在类框中名称分栏的右上角标记“1”来表示这种类。
参考书籍
[1] UML和模式应用(原书第3版)作者:拉曼