在系统的逻辑视图中,类图用于表示类和它们之间的关系, 单张类图表示了系统类结构的一个视图。在分析时,我们
采用类图来说明实体共同的角色和责任,这些实体提供了系统的行为。在设计时,我们采用类图来记录类的结构,这
些类构成了系统的架构。
类图中的两个基本元素:类和它们的基本关系。
基本概念:类表示法
类图标由三部分组成:第一部分用于放置类名,第二部分用于放置属性,第三部分用于放置操作(行为)。
如下图所示:
每个类都需要一个名称,而且此名称必须在它的命名空间中是唯一的。并且,按照命名规范,类的名称以大写字母开
头,省略多个单词之间的空格。属性和操作的名称以小写字母开头,后续单词的首字母大写,并且像类名一样省略空
格。类是它的属性和操作的命名空间,属性名称与操作名称在类的范围内必须无二义。
属性规格说明格式:
可见性 属性名称:类型【多重性】=默认值 {特性字符串}
操作规格说明格式:
可见性 操作名称(参数名称:类型)返回值 {特性字符串}
对于特定的类图,显示一个类的某些属性和操作是有用的。对于凡是具有一点重要性的类,在一张类图中显示它的所
有属性既不方便,也不必要。一般只显示重要的属性和行为。
抽象类是不能创建实例的类,但是这种类对于构建良好的类层次结构非常重要,所以提供了一种特殊的方式来表示抽
象类。具体来说,用斜体来显示其类名,表明只能为它的子类创建实例。当然,为了表明一个操作是抽象的,同样采
用斜体来显示操作名称。意味着这个操作可以在它的子类中以不同的方式实现。如下图所示:
基本概念:类关系
在UML类图中,常见的类关系有:泛化(Generalization),实现(Realization),关联(Association),聚合
(Aggregation),组合(Composition),依赖(Dependency)。
泛化(Generalization):
【泛化关系】:是一种继承关系,是"是一种"关系的体现 ,表示一般与特殊的关系,它指定了子类如何特化父类的所
有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性
【箭头指向】 :带三角箭头的实线,箭头指向父类,如下图所示:
实现(Realization):
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。、、
【箭头指向】:带三角箭头的虚线,箭头指向接口,如下图所示:
关联(Association):
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以
是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者,如下图所示:
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,
一名学生可能要上多门课程,课程是个抽象的东西它不拥有学生。
下图为自身关联:
聚合(Aggregation):
【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开
车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体,如下图所示:
组合(Composition):
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公
司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的
对象的生命周期。选择聚合通常是分析或架构设计时的决定,选择组合(物理包容)通常是具体的、战术的问题。区
分物理包容是有必要的,因为在构建和销毁聚合体的部分时,它的语义会起作用。
【代码体现】:成员变量
【箭头及指向】:带实心菱形的实线,菱形指向整体,如下图所示:
依赖(Dependency):
【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者,如下图所示:
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这张UML图,比较形象地展示了各种类图关系:
在类图上,大家可能看到1或者n的字样,实际上这是“多重性”的体现,多重性就是是否存在多个的体现。多应用于关
联的目标端,说明源类和目标类实例的连接个数。通常最好显示多重性,避免造成误解。
高级概念:模板(参数化)类
模板类代表了一个类家族,它们的结构和行为与形式化的类参数是分别定义的。我们必须将这些形式化的参数映射到
某一个具体类(绑定的过程),然后才能得到这个类家族中的一个具体的类。所谓具体的类,指的是它能够拥有实
例。
模板类 与普通类有很大的不同,在UML类图中,我们采用一种特殊的修饰来表示模板类。在它的右上角我们给定一个
虚线框,其中包含了它的形式化参数。绑定的类也表现为一个简单的类。模板类和绑定类之间的绑定关系用一个虚线
箭头来表示,箭头指向模板类,带有关键词《bind》.实际的参数和模板的形式参数绑定,它会单独显示,带有形如
<Formal Parameter->Actual Paramerter>的关键词。如下图所示,PlanSet类与Set模板类绑定,GardeningPlan类是
实参,代替了形参Item.
模板类不能够拥有任何实例,也不能单独使用。绑定类定义了一种新类,与同一家族中其他类都不同,这些类具有不
同的实参。
高级概念:可见性
可见性主要是指包中包含的元素能否在包外可见。对于类中包含的元素,类也提供了封闭的命名空间。几乎所有的对
象编程语言都提供了类接口和类实现的清晰分离。在UML类图中,我们利用以下的符号指定相应元素的可见性:
公有可见性(+)对能看到这个类的任何元素都可见。
保护可见性(#)对这个类及其子类的其他元素可见。
私有可见性(-) 对这个类的其他元素可见。
包可见性(~) 对同一包中的其他元素可见。
如下图所示:
位于CropDatabase类和GrainCrop类之间的关联端名称(database和crop)都是公有的,这意味着每个类都可以访问
另一个类。与之不同的是,GrainCrop类和GrainYieldPredictor类之间的关联端名称的可见性,表示GrainCrop对于
GrainYieldPredictor类是私有的。
关联是分析类之间的双向逻辑连接。当然这些可见性符号也适用于嵌套的实体,形式完全一样。具体来说,在类的图
标中,我们可以在属性和操作名称前面加上可见性符号,说明属性和操作的可访问性。如上图中的Crop类具有一个公
有属性(scientificName)、一个保护属性(yield)及一个私有属性(nutrientValue)。
高级概念:注解
很多时候,在分析和设计时,存在大量似乎是随意的假定和决定,每个开发者都可能收集这些假定和决定。但是没有
方便的地方存放这些信息,只能记在开发者的脑子里。导致这些见解常常会丢失。因此,对图中的任意元素添加任意
的注解是有用的,注解的文字记录了这些假定和决定。
在UML图中,大家使用特别的注解形状的图标,用虚线将它与它影响的元素连起来。注解可能包含任何信息,包括纯
文本、代码片段或对其他文档的引用。注解可能不与任何图中的元素相连,这表示它适用于整张图。
如下图所示: