UML类图中的关联

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UML类图中的关联、聚合和组合

李云

Email:***********************

Blog:

摘要

本文介绍了UML关联的三种形式,此外,通过给出例子和相应的程序源代码帮助读者加深理解。关键词

UML 关联聚合组合

缩略语

UML Unifed Modeling Language 统一建模语言

参考资料

《OMG UML Superstructure version 2.2》

类图中的关联

关联

1 类图中的

关联(association,请参见Superstructure的7.3.3节)表示两个或多个类实例之间所存在的一种语义关系(sematic relationship)。一个关联至少有两个用属性(property,请参见Superstructure 的7.3.44节)表达的终端(end)。一个关联关系表明了多个所关联类实例(instance)之间的连接(link),也就是说关联是连接的集合。一个连接是一个包含两个关联终端的值的元组,每一个关联终端的值表示一个末端类型的实例。图1中,连接类Car和类Window的直线就表示一个关联关系,这个关联关系只有一个连接,因为只有两个类。连接的两个末端分别是car_和windows_,car_是终端类Car 的实例(名),而windows_是终端类型Window的实例(名)。在1.3节讨论关联的元数时,我们会进一步讨论连接与关联的关系。一个关联可以包含多个终端(或说多个类),且关联终端可以是相同的类型(或相同的类)。

图 1

关联在我们的语言中的表现形式是什么样子的呢?下面先看看用Visual Paradigm for UML生成图1中的C++代码是怎么样的,在Visual Paradigm for UML中选择相应的C++代码生成菜单,如图2所示。

图 2

此时,将出现如图3所示的对话框,选择所需生成代码的元素和被生成代码的存放路径后,点击“Generate”按钮。之后,在相应的目录中将生成四个文件,分别是Car.h、Car.cpp、Window.h 和Window.cpp。

图 3

为了看一看所生成的代码中关联是如何表达的,我们需要查看一下Car.h和Window.h。其代码如图4所示。从图4中可以看出关联关系在类中表现为一个成员变量或说是属性。

Car.h

00001: #include

00002: #include

00003: #include

00004: using namespace std;

00005:

00006: #ifndef __Car_h__

00007: #define __Car_h__

00008:

00009: // #include "Window.h"

00010:

00011: class Window;

00012: class Car;

00013:

00014: class Car

00015: {

00016: private: Window* windows_;

00017: };

00018:

00019: #endif

Window.h

00001: #include

00002: #include

00003: #include

00004: using namespace std;

00005:

00006: #ifndef __Window_h__

00007: #define __Window_h__

00008:

00009: // #include "Car.h"

00010:

00011: class Car;

00012: class Window;

00013:

00014: class Window

00015: {

00016: private: Car* car_;

00017: };

00018

00019: #endif

图 4

1.1 关联的可导航性

可导航性(navigability)表示一个关联中连接的一端在运行时是否能被另一端有效的存取。或者通俗的说可导航性的意思就是一个类能否通过所关联的类实例来调用类的方法。对于图1,如果没有指明可导航性,则默认是双向都可导航的,这也是为什么生成的代码会互相拥有一个对方类型的指针变量的原因。对于图4,从导航性角度来说,由于类Car和类Window之间的关系是相互可导航的,所以类Car可以通过windows_变量调用类Window的方法(或说是函数)。反之,类Window 也可以通过car_变量来调用类Car的方法。

回到图1中的类图,我们看一看是不是有些东西可以更加的精确。比如,车(用类Car表示)可能需要调用窗户(用类Window表示)的成员函数以实现窗户的开关,但窗户却不需要调用车的任何函数去实现特定的功能,从UML角度来说,从类Car到类Window是可导航的,但从类Window 不需要导航到类Car。为此,我们将图1修订成图5。在1.2节讨论关联的多重性时,我们看一看一个不可导航的关联所生成的代码与可导航的关联有什么不同。

图 5

1.2 关联的多重性

前面说到关联的终端是类的实例,但实例的个数可能是需要指定的,即可以根据应用的需要进行指定。比如,通常情况下,一辆车有四个窗户,即窗户可以有四个实例;而一个窗户只能是属于一辆车。这在UML中如何在关联关系上进行表达呢?在UML中对于关联,我们可以用多重性(multiplicity)来限定一个末端(或属性)的数量。

多重性是采用如下的格式来表示的:

‘..’

其中,都是一个数字,分别表示实例个数的下限和上限。此外,“*”表示任意多个,还有就是当上限和下限值相同时,即必须是一个固定值,我们可以采用简写形式。比如,对于“1..1”我们可以简写成“1”,对于“*..*”我们可以简写成“*”。

加入多重性后的图如图6所示,在后面谈到聚合和组合时,我们会使该图更加的精确。图6所生成的C++代码列出于图7中。

图 6

Car.h

00001: #include

00002: #include

00003: #include

00004: using namespace std;

相关文档
最新文档