程序猿居家旅游必备技能-如何画UML类图

在系统的逻辑视图中,类图用于表示类和它们之间的关系, 单张类图表示了系统类结构的一个视图。在分析时,我们采用类图来说明实体共同的角色和责任,这些实体提供了系统的行为。在设计时,我们采用类图来记录类的结构,这些类构成了系统的架构。

类图中的两个基本元素:类和它们的基本关系。

基本概念:类表示法

类图标由三部分组成:第一部分用于放置类名,第二部分用于放置属性,第三部分用于放置操作(行为)。
如下图所示:

每个类都需要一个名称,而且此名称必须在它的命名空间中是唯一的。并且,按照命名规范,类的名称以大写字母开头,省略多个单词之间的空格。属性和操作的名称以小写字母开头,后续单词的首字母大写,并且像类名一样省略空格。类是它的属性和操作的命名空间,属性名称与操作名称在类的范围内必须无二义。

属性规格说明格式:
可见性 属性名称:类型【多重性】=默认值 {特性字符串}

操作规格说明格式:
可见性 操作名称(参数名称:类型)返回值 {特性字符串}

对于特定的类图,显示一个类的某些属性和操作是有用的。对于凡是具有一点重要性的类,在一张类图中显示它的所有属性既不方便,也不必要。一般只显示重要的属性和行为。

抽象类是不能创建实例的类,但是这种类对于构建良好的类层次结构非常重要,所以提供了一种特殊的方式来表示抽象类。具体来说,用斜体来显示其类名,表明只能为它的子类创建实例。当然,为了表明一个操作是抽象的,同样采用斜体来显示操作名称。意味着这个操作可以在它的子类中以不同的方式实现。如下图所示:

基本概念:类关系

在UML类图中,常见的类关系有:泛化(Generalization),实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。

泛化(Generalization):

【泛化关系】:是一种继承关系,是”是一种”关系的体现 ,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性

【箭头指向】 :带三角箭头的实线,箭头指向父类,如下图所示:

实现(Realization):

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。
【箭头指向】:带三角箭头的虚线,箭头指向接口,如下图所示:

关联(Association):

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者,如下图所示:

上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西它不拥有学生。

下图为自身关联:

聚合(Aggregation):

【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。

聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体,如下图所示:

组合(Composition):

【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。

组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。选择聚合通常是分析或架构设计时的决定,选择组合(物理包容)通常是具体的、战术的问题。区分物理包容是有必要的,因为在构建和销毁聚合体的部分时,它的语义会起作用。

【代码体现】:成员变量

【箭头及指向】:带实心菱形的实线,菱形指向整体,如下图所示:

依赖(Dependency):

【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者,如下图所示:

各种关系的强弱顺序:

泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

下面这张UML图,比较形象地展示了各种类图关系:

在类图上,大家可能看到1或者n的字样,实际上这是“多重性”的体现,多重性就是是否存在多个的体现。多应用于关联的目标端,说明源类和目标类实例的连接个数。通常最好显示多重性,避免造成误解。