UML 类图学习小结

类图是使用频率最高的 UML 图之一。

类图的作用有:

  • 用于描述系统中所包含的类以及它们之间的相互关系
  • 帮助人们简化对系统的理解
  • 是系统分析和设计阶段的重要产物
  • 是系统编码和测试的重要模型依据

类 Class 封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

  • 一个类可以有多种职责,设计得好的类一般只有一种职责
  • 在定义类的时候,将类的职责分解成为类的属性(数据职责)和方法(行为职责)
  • 类将被实例化成对象 Object,对象对应于某个具体的事物,是类的实例 Instance

在系统分析与设计阶段,类通常可以分为三种,分别是实体类 Entity Class、控制类 Control Class 和边界类 Boundary Class

  1. 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,一般使用数据库表或文件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。实体类来源于需求说明中的名词,如学生、商品等。
  2. 控制类:控制类用于体现应用程序的执行逻辑,提供相应的业务操作,将控制类抽象出来可以降低界面和数据库之间的耦合度。控制类一般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有一个商品增加类,注册对应有一个用户注册类等
  3. 边界类:边界类用于对外部用户与系统之间的交互对象进行抽象,主要包括界面类,如对话框、窗口、菜单等。

在面向对象分析和设计的初级阶段,通常首先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。

类的 UML 图示

在 UML 中,类使用包含类名、属性和操作且带有分隔线的长方形来表示,如定义一个 Employee 类,它包含属性 nameageemail,以及操作 modifyInfo(),在 UML 类图中该类如下所示:

UML 类图中类的组成

类名

每个类都必须有一个名字,类名是一个字符串

类的属性 Attributes

属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。

UML规定属性的表示方式为:可见性 名称:类型 [ = 缺省值 ]

  • 可见性 表示该属性对于类外的元素而言是否可见,包括公有 public、私有 private 和受保护 protected 三种,在类图中分别用符号 +-# 表示。
  • 名称 表示属性名,用一个字符串表示。
  • 类型 表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
  • 缺省值 是一个可选项,即属性的初始值。

类的操作 Operations

操作是类的任意一个实例对象都可以使用的行为,是类的成员方法。

UML规定操作的表示方式为:可见性 名称(参数列表) [ : 返回类型]

  • 可见性 的定义与属性的可见性定义相同。
  • 名称 即方法名,用一个字符串表示。
  • 参数列表 表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。
  • 返回类型 是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型 void,如果是构造方法,则无返回类型。

下图操作 method1 的可见性为 public(+),带入了一个 Object 类型的参数 par,返回值为空 void;操作 method2 的可见性为 protected(#),无参数,返回值为 String 类型;操作 method3 的可见性为 private(-),包含两个参数,其中一个参数为 int 类型,另一个为 int[] 类型,返回值为 int 类型。

实例分析

下面是一个顾客从零售商处预定商品的模型的类图。中心的类是 Order。连接它的是购买货物的 CustomerPaymentPayment 有三种形式:CashCheck 或者 Credit。订单包括 OrderDetails,订单详情包含多个订单项 Item

UML类的符号是一个被划分成三块的方框:类名,属性,和操作。抽象类的名字,像 Payment 是斜体的。类之间的关系是连接线。

上面的类图有三种关系:

  • 关联 association - 表示两种类的实例间的关系。如果一个类的实例必须要用另一个类的实例才能完成工作时就要用关联。
  • 聚合 aggregation - 当一个类属于一个容器是的一种特殊关系。在我们的图里,OrderOrderDetails 的容器。
  • 泛化 generalization - 一个指向以其他类作为超类的继承连线。PaymentCashCheckCredit 的超类。

一个关联有两个尾端。每个尾端可以有一个角色名 role name 来说明关联的作用。比如:一个 OrderDetails 实例是一个 Order 实例的项目。

关联上的方向性箭头表示该关联传递或查询的方向。OrderDetails 类可以查询他的 Item,但不可以反过来查询。箭头方向同样可以告诉你哪个类拥有这个关联的实现;也就是 OrderDetails 拥有 Item。没有方向性的箭头的关联是双向。

关联尾端的数字表示该关联另一边的一个实例可以对应的数字端的实例的格数,通过这种方式表达关联的多样性 multiplicity。多样性的数字可以是一个单独的数字或者是一个数字的范围。在例子中,每个 Order 只有一个 Customer,但一个 Customer 可以有任意多个 Order

多样性 意义
0..1 0或1个实例,n..m符号表示有n到m个实例
0..* or * 没有实例格数的限制(包括没有)
1 只有一个实例
1..* 最少一个实例

每个类图包括类,关联和多样性表示。方向性和角色是为了使图示得更清楚时可选的项目。

包和对象图

为了简单地表示出复杂的类图,可以把类组合成包 packages。一个包是 UML 上有逻辑关系的元件的集合。下面这个图是是一个把类组合成包的一个商业模型。

dependencies 关系。如果另一个的包B改变可能会导致一个包A改变,则包A依赖包B。

  • 包是用一个在上方带有小标签的矩形表示的。
  • 包名写在标签上或者在矩形里面。
  • 点化线箭头表示依赖。

对象图 Object diagrams 用来表示类的实例。他们在解释复杂关系的细小问题时(特别是递归关系时)很有用。

这个类图表示一个大学的 Department 可以包括其他很多的 Departments

  • 每个类图的矩形对应了一个单独的实例。
  • UML 中实例名带有下划线。
  • 只要意思清楚,类或实例名可以在对象图中被省略。

相关阅读

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Apr 4, 2016

奉献爱心