[转载]UML类图总结

时间:2023-12-06 16:50:32

前言

类图和序列图是UML中最常用的两种Diagram。我将做详细的总结。在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系。这足以说明类图的重要性。 对类图的基本认识有以下两点:

  1. 类图是以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法;
  2. 类图中的类与面向对象语言中的类的概念是对应的,是对现实世界中的事物的抽象。 我们基于以上两点,来对类图进行更详细的学习。

类图中基本语法学习

在UML中,画每一种图,都有一套规范的,不同的符号是不同的意义,我们要熟悉这些符号的意义,才能理解一副类图的意义。 先来一副画好的类图,从解析这个类图开始:

[转载]UML类图总结

如图,这是一副很简单的类图,很简单,也很熟悉。 可以看到,这个类图,从上到下分为三部分。是的,一般类图从上到下分为三部分,分别是:

  1. 类名
  2. 属性
  3. 操作

正如你所看到的,上面类图的名称是Student,属性有Name, Sex, Age, 对应的操作有六个。你应该知道一个类图的Student是必须存在的,而属性和操作是可选的。如果,你看到了一个没有任何属性和操作的类时,也不要感到惊讶,那是正确,虽然不是很正常。 类的名字没有什么好说的,那么,我从属性开始,例如以下属性: - Name:String 如果你看过Objective-C,你也许就不会感到惊讶,为什么有减号和加号了,但是,伙计,这里的减号和加号和Objective-C中的意思是完全不同的。 这里的加号和减号表示的是属性和方法的可访问性,有如下定义:

  1. -表示private
  2. +表示public
  3. #表示protected

Name表示的是属性的名称,而它后面的String表示的是这个属性的类型; 那么现在对于- Name:String就好理解了;它表示Student类中定义的一个私有的String类型的属性Name;而对于图中这样的一个特例: - Age:int=10 在这里,int=10,表示的Age属性的默认值为10。

最下面是类的操作,“+”的意思,已经解释过了。我选取以下的一个操作进行详细讲解: + SetAge(Age:int):void 操作名为SetAge,参数为int类型的Age,操作的返回值为void。有的时候,我们会遇到以下的这种语法: + SetAge(in Age:int):void 是的,多了一个in关键字,这个关键字表示这个Age参数是输入参数,如果看过C#的话,理解其中的out关键字,我想in就不用我多讲了。

抽象类

看下面这个图:

[转载]UML类图总结

你会发现类名和Eat方法是以斜体字体表示的;在类图中以斜体表示也是有特殊意义的,上图表示Animal是一个抽象类,抽象类是不能实例化的,一般至少包含一个抽象操作,比如上图的Eat就是抽象操作。

接口

看下图这个图:

[转载]UML类图总结

这是接口的表示方法。接口是什么,不用做什么解释。这里让大家对接口图有一个大体的了解。

类图之间的关系

对于类图的基本讲解就到这里了,接下来讲解类图中最重要的一部分,也是比较难理解的一部分:类图之间的关系。 一个负责的系统,每个类不是独立存在的,而是类与类组织起来的,而每个类之间的关系是错综复杂的,那么UML是如何表达其中的关系的呢?

继承关系

继承关系是一种基本而重要的关系;至于继承的概念,我就不做解释了,而只讲UML中对继承的表示。

[转载]UML类图总结[转载]UML类图总结

以上两张图,都是Astah中对继承关系的表示方法,继承通过指向超类的一条闭合的,单箭头的实线表示。这个表示和用例图中的泛化表示方式是一致的,不熟悉的朋友,可以去看看UML用例图总结这篇文章。

关联关系

当系统建模时,特定的对象间会彼此关联,而且这些关联本身需要被清晰地建模,这里我会介绍5中关联,关于什么时候使用哪种关联,这里是不做介绍的,这里而是将重点集中在每种关联的用途,并说明如何在类图上表现出来。

双向的关联

[转载]UML类图总结

关联是两个类之间的连接,关联总是被假定是双向;这说明,两个类彼此知道它们之间的关系,都可以调用对方的公共属性和方法;虽然在分析阶段这种关系是适用的,但我觉得对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针;对象引用本身就是有向的。这种关系在设计的时候比较少用到,关联一般都是有向的。

单向关联 在一个单向关联中,两个类是相关的,但是只有一个类知道这种关系的存在。如下图:

[转载]UML类图总结

一个单向的关联,表示为一条带有指向已知类的开放箭头的实线。Class0知道Class1的存在,而Class1不知道Class0的存在,Class0可以调用Class1的公共属性和方法。使用Astah导出代码时,单向关联体现为Class0中包含一个Class1对象。

关联类 这个概念有点不好理解,我也是参考别人的理解,再做出自己的理解,如下图:

[转载]UML类图总结

Person和Company是有关系的,存在什么关系?存在一个雇佣的关系,由于存在一个Job,导致Person和Company产生了关系,但是在建模时,由于Job将Person和Company关联到了一起,而描述Job的Salay放在Person或者Company都不是很合适的,由于不同的岗位有不同的Salary,如果将岗位和Salary放在Person,将导致Person类存在很高的耦合性。所以关联出一个关联类Job,表示岗位信息。从图中可以看出,Job类即是一个关联关系也是一个类,是为了描述类Person与类Company之间的关联关系的。

聚合 聚合是一种特别类型的关联,用于描述“总体到局部”的关系。 基本聚合 在基本聚合中,部分类的生命周期独立于整体类的生命周期;如下图:

[转载]UML类图总结

房子是一个整体实体,而窗户是房子的一部分,而窗户可以在建房子之前就创建,在这里,Window实例清楚地独立地Car类实例而存在。使用空心的菱形表示。

组合聚合 组合聚合也叫包容,但是子类实例的生命周期依赖于父类实例的生命周期;如下图:

[转载]UML类图总结

公司是一个整体实体,公司包含部门,部门不能独立于公司而存在。使用实心菱形表示。

自身关联(反射关联) 就是自身关联自身,你可能想不到这样存在的意义,但是,你要想到,类可以是抽象的,当一个类关联到它本身时,这并不意味着类的实例与它本身相关,而是类的一个实例与类的另一个实例相关,可以表现为多肽,在UML中就是如下图所示:

[转载]UML类图总结

实现接口

如下图:

[转载]UML类图总结

在UML中表示的很简单,就是将泛化中的实线变成了虚线就好了。

总结

这篇文章大体的对UML类图做了一个总结,平时工作中涉及到的内容都大体上做了介绍,如果有什么遗漏,请大家指出。同时,在本文中所有的类图都是使用Astah画的,关于使用Astah画类图,大家可以参考:UML工具Astah的使用

附录

多重值和它们的表示

表示 含义
0..1 0个或1个
1 只能1个
0..* 0个或多个
*
0个或多个
1..* 1个或多个
3 只能3个
0..5 0到5个
5..15 5到15个

博客转自:《UML类图总结