类图的目的是显示建模系统的品类,顶部区域显示类的名字

http://www.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/

 

基础

基础

如先前所涉嫌的,类图的目的是显得建模系统的花色。在大部的 UML
模型中这一个品种包蕴:

如先前所提到的,类图的目的是显得建模系统的门类。在半数以上的 UML
模型中这个系列包涵:

  • 接口

  • 数据类型

  • 组件

  • 接口

  • 数据类型

  • 组件

UML
为那些连串起了一个专程的名字:“分类器”。日常地,你可以把分类器当做类,但在技术上,分类器是尤其宽广的术语,它照旧引用上面的其余三连串型为好。

UML
为那个项目起了一个专门的名字:“分类器”。常常地,你可以把分类器当做类,但在技术上,分类器是更为普遍的术语,它仍然引用上边的其他三种类型为好。

类名

类名

类的 UML 表示是一个长方形,垂直地分为多个区,如图 1
所示。顶部区域显示类的名字。中间的区域列出类的品质。底部的区域列出类的操作。当在一个类图上画一个类元素时,你无法不要有上面的区域,上面的二个区域是可挑选的(当图描述仅仅用于显示分类器间涉及的高层细节时,下边的四个区域是不必要的)。图
1 突显一个航线班机如何作为 UML
类建模。正如大家所能见到的,名字是 Flight,大家得以在中等区域来看Flight类的3个特性:flightNumber,departure提姆e

flightDuration。在底层区域中我们可以看看Flight类有三个操作:delayFlight
和 getArrival提姆e。

类的 UML 表示是一个长方形,垂直地分成八个区,如图 1
所示。顶部区域呈现类的名字。中间的区域列出类的品质。底部的区域列出类的操作。当在一个类图上画一个类元素时,你必要求有上面的区域,上边的二个区域是可挑选的(当图描述仅仅用于显示分类器间事关的高层细节时,下边的多少个区域是不须要的)。图
1 突显一个航道班机怎么样作为 UML 类建模。正如我辈所能见到的,名字是
Flight,我们得以在中游区域看到Flight类的3个特性:flightNumber,departure提姆e

flightDuration。在底部区域中大家得以看出Flight类有多少个操作:delayFlight
和 getArrival提姆e。

betvictor1946 1

betvictor1946 2

图 1: Flight类的类图

图 1: Flight类的类图

类属性列表

类属性列表

类的属性节(中部区域)在分隔线上列出每一个类的习性。属性节是可选取的,倘若一用它,就含有类的列表突显的每个属性。该线用如下格式:

类的属性节(中部区域)在分隔线上列出每一个类的质量。属性节是可接纳的,假诺一用它,就包括类的列表突显的每个属性。该线用如下格式:

name : attribute type
flightNumber : Integer
name : attribute type
flightNumber : Integer

此起彼伏大家的Flight类的例证,大家得以行使品质类型音信来叙述类的习性,如表 1
所示。

三番五次我们的Flight类的事例,大家得以利用性质类型消息来讲述类的性质,如表 1
所示。

表 1:具有关联类型的Flight类的属性名字

表 1:具有关联类型的Flight类的习性名字

属性名称 属性类型
flightNumber Integer
departureTime Date
flightDuration Minutes
属性名称 属性类型
flightNumber Integer
departureTime Date
flightDuration Minutes

在工作类图中,属性类型一般与单位符合,这对于图的恐怕读者是有含义的(例如,分钟,卢比,等等)。不过,用于转移代码的类图,须求类的性质类型必须界定在由程序语言提供的档次之中,或含有于在系统中完毕的、模型的系列之中。

在作业类图中,属性类型一般与单位符合,那对于图的或是读者是有含义的(例如,分钟,法郎,等等)。可是,用于转移代码的类图,要求类的特性类型必须界定在由程序语言提供的品类之中,或包罗于在系统中完结的、模型的门类之中。

在类图上显得所有默许值的一定属性,有时是卓有功能的(例如,在银行账户应用程序中,一个新的银行账户会以零为早先值)。UML
规范允许在属性列表节中,通过利用如下的记号作为默许值的标识:

在类图上出示所有默许值的特定属性,有时是实用的(例如,在银行账户应用程序中,一个新的银行账户会以零为开首值)。UML
规范允许在属性列表节中,通过选择如下的标志作为默许值的标识:

name : attribute type = default value
name : attribute type = default value

举例来说:

比方来说:

balance : Dollars = 0
balance : Dollars = 0

显示属性默许值是可选择的;图 2
展现一个银行账户类具有一个名为 balance的花色,它的默许值为0。

显示属性默许值是可选取的;图 2 呈现一个银行账户类具有一个名为
balance的门类,它的默许值为0。

betvictor1946 3

betvictor1946 4

图 2:展现默许为0英镑的balance属性值的银行账户类图。

图 2:展现默许为0英镑的balance属性值的银行账户类图。

类操作列表

类操作列表

类操作记录在类图长方形的第多少个(最低的)区域中,它也是可选择的。和特性一样,类的操作以列表格式突显,每个操作在它自己线上。操作使用下列记号表现:

类操作记录在类图长方形的第六个(最低的)区域中,它也是可挑选的。和性质一样,类的操作以列表格式显示,每个操作在它和谐线上。操作使用下列记号表现:

    name(parameter list) : type of value returned
  name(parameter list) : type of value returned

下边的表 2 中Flight类操作的照耀。

下边的表 2 中Flight类操作的照射。

表 2:从图 2 辉映的Flight类的操作

表 2:从图 2 辉映的Flight类的操作

操作名称 返回参数 值类型
delayFlight
Name Type
numberOfMinutes Minutes
N/A
getArrivalTime N/A Date
操作名称 返回参数 值类型
delayFlight
Name Type
numberOfMinutes Minutes
N/A
getArrivalTime N/A Date

图3显得,delayFlight 操作有一个Minutes类型的输入参数 —
numberOfMinutes。然则,delayFlight
操作没有再次回到值。 1 当一个操作有参数时,参数被放在操作的括号内;每个参数都拔取那样的格式:“参数名:参数类型”。

图3体现,delayFlight 操作有一个Minutes类型的输入参数 —
numberOfMinutes。但是,delayFlight
操作没有再次回到值。1当一个操作有参数时,参数被放在操作的括号内;每个参数都选取这样的格式:“参数名:参数类型”。

betvictor1946 5

betvictor1946 6

图 3:Flight类操作参数,包涵可选取的“in”标识。

图 3:Flight类操作参数,包涵可选拔的“in”标识。

当文档化操作参数时,你也许利用一个可挑选的提醒器,以浮现参数到操作的输入参数、或输出参数。这一个可选择的提示器以“in”或“out”出现,如图3中的操作区域所示。一般的话,除非将动用一种早期的程序编程语言,如Fortran
,那么些提醒器可能会有着辅助,否则它们是不需要的。可是,在
C++和Java中,所有的参数是“in”参数,而且依据UML规范,既然“in”是参数的默许类型,超过半数人将会遗漏输入/输出指示器。

当文档化操作参数时,你恐怕应用一个可挑选的提醒器,以突显参数到操作的输入参数、或输出参数。那个可挑选的提示器以“in”或“out”出现,如图3中的操作区域所示。一般的话,除非将应用一种早期的程序编程语言,如Fortran
,那些提示器可能会有着援助,否则它们是不需求的。不过,在
C++和Java中,所有的参数是“in”参数,而且根据UML规范,既然“in”是参数的默许类型,半数以上人将会遗漏输入/输出指示器。

继承

继承

在面向对象的安顿性中一个可怜重大的定义,继承,指的是一个类(子类)继承别的的一个类(超类)的均等作用,并增加它和谐的新职能(一个非技术性的比喻,想象我再而三了自家姑姑的貌似的音乐力量,可是在自我的家里,我是绝无仅有一个玩电吉他的人)的能力。为了在一个类图上建模继承,从子类(要继续行为的类)拉出一条闭合的,单键头(或三角形)的实线指向超类。考虑银行账户的项目:图
4 突显 CheckingAccount 和 SavingsAccount 类怎样从 BankAccount
类继承而来。

在面向对象的筹划中一个卓越紧要的概念,继承,指的是一个类(子类)继承除此以外的一个类(超类)的一模一样成效,并追加它和谐的新功用(一个非技术性的比方,想象我三番五次了我大姑的相似的音乐力量,然则在自己的家里,我是绝无仅有一个玩电吉他的人)的能力。为了在一个类图上建模继承,从子类(要延续行为的类)拉出一条闭合的,单键头(或三角形)的实线指向超类。考虑银行账户的档次:图
4 呈现 CheckingAccount 和 SavingsAccount 类如何从 BankAccount
类继承而来。

betvictor1946 7

betvictor1946 8

图 4: 继承通过指向超类的一条闭合的,单箭头的实线表示。

图 4: 继承通过指向超类的一条闭合的,单箭头的实线表示。

在图 4 中,继承关系由每个超类的单独的线画出,这是在IBM Rational
罗斯和IBM Rational
XDE中采纳的法门。然则,有一种叫做 树标记的准备方式可以画出继承关系。当存在五个或愈来愈多子类时,如图
4 中所示,除了一连线象树枝一样混在一块儿外,你可以使用树形记号。图 5
是重绘的与图 4 一样的持续,可是这一次使用了树形记号。

在图 4 中,继承关系由各类超类的单身的线画出,那是在IBM Rational
罗丝和IBM Rational XDE中使用的方法。然则,有一种名叫
树标记的备选格局可以画出继承关系。当存在七个或越来越多子类时,如图 4
中所示,除了一连线象树枝一样混在一道外,你可以使用树形记号。图 5
是重绘的与图 4 一样的继承,不过本次使用了树形记号。

betvictor1946 9

betvictor1946 10

图 5: 一个拔取树形记号的存续实例

图 5: 一个应用树形记号的一连实例

抽象类及操作 
细心的读者会小心到,在图 4 和 图5
中的图中,类名BankAccount和withdrawal操作使用斜体。那代表,BankAccount
类是一个抽象类,而withdrawal方法是空虚的操作。换句话说,BankAccount
类使用withdrawal规定抽象操作,并且CheckingAccount 和 SavingsAccount
七个子类都各自地执行它们各自版本的操作。

抽象类及操作
细心的读者会专注到,在图 4 和 图5
中的图中,类名BankAccount和withdrawal操作使用斜体。那象征,BankAccount
类是一个抽象类,而withdrawal方法是用空想来安慰自己的操作。换句话说,BankAccount
类使用withdrawal规定抽象操作,并且CheckingAccount 和 SavingsAccount
八个子类都各自地实践它们各自版本的操作。

但是,超类(父类)不自然如若抽象类。标准类作为超类是健康的。

可是,超类(父类)不肯定若是抽象类。标准类作为超类是例行的。

关联 
当您系统建模时,特定的靶子间将会相互关系,而且这么些关系本身要求被明晰地建模。有多样关系。在这一局地中,我将会谈谈它们中的七个– 双向的涉及和单向的涉及,而且我将会在Beyond the
basics
有的琢磨剩下的三种关系类型。请小心,关于何时该利用每系列型涉及的详尽研商,不属于本文的界定。相反的,我将会把关键集中在每种关系的用处,并证实什么在类图上画出涉嫌。

关联
当你系统建模时,特定的目的间将会相互关系,而且那一个涉及本身须要被清楚地建模。有四种关系。在这一部分中,我将会谈论它们中的五个– 双向的关系和单向的涉嫌,而且我将会在Beyond the
basics
一部分探讨剩下的二种关系类型。请留心,关于几时该选取每种类型涉及的事无巨细座谈,不属于本文的限制。相反的,我将会把第一集中在每种关系的用途,并证实什么在类图上画出涉及。

双向(标准)的关联 
提到是三个类间的连结。关联总是被假定是双向的;那象征,四个类相互掌握它们间的联络,除非你限定一些其余项目标关联。回想一下Flight
的例子,图 6 显示了在Flight类和Plane类之间的一个规范项目的涉及。

双向(标准)的关联
涉及是多少个类间的联网。关联总是被假定是双向的;那代表,多少个类相互精晓它们间的关系,除非您限定一些其余种类的涉及。回想一下Flight
的事例,图 6 突显了在Flight类和Plane类之间的一个业内项目的涉嫌。

betvictor1946 11

betvictor1946 12

图 6:在一个Flight类和Plane类之间的双向关联的实例

图 6:在一个Flight类和Plane类之间的双向关联的实例

一个双向关联用五个类间的实线表示。在线的任一端,你放置一个角色名和多重值。图
6
突显Flight与一个一定的Plane相关联,而且Flight类知道那一个涉及。因为角色名以Plane类表示,所以Plane承担关联中的“assignedPlane”角色。紧接于Plane类后边的多重值描述0…1象征,当一个Flight实体存在时,能够有一个或从不Plane与之提到(也就是,Plane可能还尚未被分配)。图
6
也显得Plane知道它与Flight类的关系。在那一个涉及中,Flight承担“assignedFlights”角色;图
6
的图告诉大家,Plane实体可以不与flight关联(例如,它是一架全新的飞行器)或与没有上限的flight(例如,一架已经服役5年的飞行器)关联。

一个双向关联用七个类间的实线表示。在线的任一端,你放置一个角色名和多重值。图
6
展现Flight与一个特定的Plane相关联,而且Flight类知道那几个关系。因为角色名以Plane类表示,所以Plane承担关联中的“assignedPlane”角色。紧接于Plane类前面的多重值描述0…1象征,当一个Flight实体存在时,可以有一个或尚未Plane与之提到(也就是,Plane可能还并未被分配)。图
6
也呈现Plane知道它与Flight类的涉嫌。在这么些关系中,Flight承担“assignedFlights”角色;图
6
的图告诉我们,Plane实体可以不与flight关联(例如,它是一架全新的飞机)或与没有上限的flight(例如,一架已经服役5年的飞机)关联。

鉴于对那个在提到底部可能现身的多重值描述感到纳闷,上面的表3列出了一部分多重值及它们含义的例证。

是因为对这几个在事关底部可能出现的多重值描述感到迷惑不解,上面的表3列出了有些多重值及它们含义的例证。

表 3: 多重值和它们的代表

表 3: 多重值和它们的象征

也许的多重值描述

可能的多重值描述

表示

表示

含义

含义

0..1

0..1

0个或1个

0个或1个

1

1

只能1个

只能1个

0..*

0..*

0个或三个

0个或多少个

*

*

0个或多少个

0个或多个

1..*

1..*

1个或自己个

1个或本人个

3

3

只能3个

只能3个

0..5

0..5

0到5个

0到5个

5..15

5..15

5到15个

5到15个

单向关系 
在一个单向关系中,七个类是连锁的,不过只有一个类知道那种关系的存在。图 7
显示单向关系的透支财务报告的一个实例。

单向关系
在一个单向关系中,三个类是相关的,不过唯有一个类知道那种关系的存在。图 7
突显单向关系的透支财务报告的一个实例。

betvictor1946 13

betvictor1946 14

图 7: 单向关系一个实例:OverdrawnAccountsReport 类 BankAccount 类,而
BankAccount 类则对事关一无所知。

图 7: 单向关系一个实例:OverdrawnAccountsReport 类 BankAccount 类,而
BankAccount 类则对关乎一窍不通。

一个单向的关系,表示为一条带有指向已知类的盛开箭头(不闭馆的箭头或三角形,用于标志继承)的实线。就像是标准提到,单向关系包罗一个角色名和一个多重值描述,可是与标准的双向关联不相同的时,单向关系只含有已知类的角色名和多重值描述。在图
7 中的例子中,OverdrawnAccountsReport 知道 BankAccount 类,而且知道
BankAccount
类扮演“overdrawnAccounts”的角色。然则,和正规提到分化,BankAccount
类并不知道它与 OverdrawnAccountsReport
相关联。 2

一个一面的关系,表示为一条带有指向已知类的盛开箭头(不倒闭的箭头或三角形,用于标志继承)的实线。就像标准提到,单向关系包蕴一个角色名和一个多重值描述,不过与正规的双向关联差别的时,单向关系只包蕴已知类的角色名和多重值描述。在图
7 中的例子中,OverdrawnAccountsReport 知道 BankAccount 类,而且知道
BankAccount
类扮演“overdrawnAccounts”的角色。可是,和业内提到分化,BankAccount
类并不知道它与 OverdrawnAccountsReport
相关联。2

软件包 
不可防止,若是您正在为一个大的系列或大的事情领域建模,在你的模型司令员会有广大见仁见智的分类器。管理所有的类将是一件令人生畏的义务;所以,UML
提供一个誉为 软件包的公司元素。软件包使建模者可以社团模型分类器到名字空间中,那有些象文件系统中的文件夹。把一个序列分为多个软件包使系统成为不难精晓,尤其是在每个软件包都表现系统的一个特定部分时。 3

软件包
不可防止,如若您正在为一个大的系统或大的事务领域建模,在您的模子司令员会有过多不等的分类器。管理所有的类将是一件令人生畏的义务;所以,UML
提供一个名为
软件包的团伙元素。软件包使建模者能够社团模型分类器到名字空间中,那有些象文件系统中的文件夹。把一个系统分为多少个软件包使系统成为不难明白,越发是在种种软件包都表现系统的一个一定部分时。3

在图中留存三种艺术表示软件包。并从未规则须求利用哪个种类标志,除了用你个人的判定:哪一类更便于阅读你画的类图。三种艺术都是由一个较小的长方形(用于固定)嵌套在一个大的长方形中早先的,如图
8 所示。不过建模者必须决定包的分子如何表示,如下:

在图中设有二种艺术表示软件包。并不曾规则必要选取哪个种类标志,除了用你个人的论断:哪一类更方便阅读你画的类图。二种格局都是由一个较小的长方形(用于固定)嵌套在一个大的长方形中初露的,如图
8 所示。然而建模者必须控制包的分子怎么着表示,如下:

  • betvictor1946,假诺建模者决定在大长方形中浮现软件包的积极分子,则怀有的那一个成员 4 亟需被停放在长方形里面。其它,所有软件包的名字必要放在软件包的较小长方形之内(如图
    8 的显得)。

  • 万一建模者决定在大的长方形之外展现软件包成员,则装有将会在图上突显的成员都亟待被放置长方形之外。为了显得属于软件包的分类器属于,从各样分类器画一条线到个中有加号的圆圆,这么些圆周粘附在软件包之上(图9)。

  • 倘使建模者决定在大长方形中显得软件包的积极分子,则兼具的这几个成员4亟需被停放在长方形里面。其余,所有软件包的名字须要放在软件包的较小长方形之内(如图
    8 的显得)。

  • 若果建模者决定在大的长方形之外显示软件包成员,则持有将会在图上显示的积极分子都亟待被安置长方形之外。为了展现属于软件包的分类器属于,从每个分类器画一条线到中间有加号的圆圆,那些圆周粘附在软件包之上(图9)。

betvictor1946 15

betvictor1946 16

图 8:在软件包的长方形内突显软件包成员的软件包元素例子

图 8:在软件包的长方形内展现软件包成员的软件包元素例子

betvictor1946 17

betvictor1946 18

图 9:一个透过连接线表现软件包成员的软件包例子

图 9:一个透过连接线表现软件包成员的软件包例子

打探基础首要性

询问基础紧要性

在 UML 2
中,通晓类图的底蕴更为紧要。那是因为类图为有着的别样协会图提供基本的创设块。如组件或对象图(仅仅是举了些例子)。

在 UML 2
中,了然类图的底蕴更为主要。那是因为类图为持有的其余社团图提供基本的创设块。如组件或对象图(仅仅是举了些例子)。



回页首

回页首

跨越基础

超过基础

到此甘休,我早就介绍了类图的根底,然而请继续往下读!在上边的部分中,我将会指点您到您会利用的类图的更要紧的上边。那些蕴含UML
2 专业中的接口,其余的二种关系类型,可知性和任何补给。

到此为止,我早就介绍了类图的基本功,不过请继续往下读!在上边的有的中,我将会率领您到您会利用的类图的更紧要的地点。这几个包含UML
2 正式中的接口,其余的二种关系类型,可知性和任何补给。

接口 
在本文的后边,我提出您以类来考虑分类器。事实上,分类器是一个越来越相似的定义,它包罗数据类型和接口。

接口
在本文的前头,我提出您以类来考虑分类器。事实上,分类器是一个越发相似的定义,它概括数据类型和接口。

有关何时、以及哪些高效地在系统结构图中利用数据类型和接口的完好切磋,不在本文的琢磨范围之内。既然那样,我干什么要在那边提及数据类型和接口呢?你或许想在结构图上模仿这个分类器类型,在那几个时候,使用正确的标志来代表,或者至少知道那一个分类器类型是首要的。不正确地绘制那个分类器,很有可能将使您的协会图读者觉得混乱,将来的系统将不可以适应须求。

有关曾几何时、以及如何连忙地在系统结构图中采纳数据类型和接口的共同体琢磨,不在本文的议论范围以内。既然那样,我何以要在此间提及数据类型和接口呢?你可能想在结构图上模仿那些分类器类型,在那些时候,使用正确的符号来表示,或者至少知道这一个分类器类型是首要的。不正确地绘制这个分类器,很有可能将使您的布局图读者感觉混乱,将来的系统将无法适应必要。

一个类和一个接口分歧:一个类可以有它造型的诚实实例,但是一个接口必须至少有一个类来完毕它。在
UML 2
中,一个接口被认为是类建模元素的特殊化。因而,接口就象类那样绘制,不过长方形的顶部区域也有文件“interface”,如图
10
所示。 5

一个类和一个接口不同:一个类可以有它造型的真正实例,可是一个接口必须至少有一个类来贯彻它。在
UML 2
中,一个接口被认为是类建模元素的特殊化。由此,接口就象类那样绘制,然则长方形的顶部区域也有文件“interface”,如图
10
所示。5

betvictor1946 19

betvictor1946 20

图 10:Professor类和Student类达成Person接口的类图实例

图 10:Professor类和Student类完成Person接口的类图实例

在图 10
中展现的图中,Professor和Student类都达成了Person的接口,但并不从它一连。大家领略那或多或少是由于上边四个原因:1)
Person对象作为接口被定义 —
它在目的的名字区域中有“interface”文本,而且大家看到由于Professor和Student对象依据画类对象的平整(在它们的名字区域中并未额外的分类器文本)标示,所以它们是 对象。
2) 大家知晓继承在那边没有被突显,因为与带箭头的线是点线而不是实线。如图
10
所示,一条带有闭合的单向箭头的 线意味着落成(或举行);正如我们在图
4 中所见到的,一条带有闭合单向箭头的线意味着继续。

在图 10
中显得的图中,Professor和Student类都落实了Person的接口,但并不从它继续。大家领略那或多或少是出于上边八个原因:1)
Person对象作为接口被定义 —
它在目的的名字区域中有“interface”文本,而且大家见到由于Professor和Student对象根据画类对象的平整(在它们的名字区域中从未额外的分类器文本)标示,所以它们是
对象。 2)
大家了然继承在此地没有被呈现,因为与带箭头的线是点线而不是实线。如图 10
所示,一条带有闭合的单向箭头的 线意味着达成(或进行);正如我们在图
4 中所见到的,一条带有闭合单向箭头的线意味着继续。

愈多的关联 
在下边,我谈谈了双向关联和单向关系。现在,我将会介绍剩下的三种档次的关系。

越多的涉及
在上头,我谈谈了双向关联和单向关系。现在,我将会介绍剩下的三序列型的涉及。

关联类 
在事关建模中,存在有的气象下,你须要包罗其它类,因为它含有了关于关联的有价值的音信。对于那种景色,你会选取 关联类 来绑定你的骨干关系。关联类和一般类一样表示。分歧的是,主类和关联类之间用一条相交的点线连接。图
11 显示一个航空工业实例的关系类。

关联类
在涉及建模中,存在部分状态下,你必要包罗其余类,因为它包涵了关于关联的有价值的信息。对于那种场所,你会利用
关联类
来绑定你的主导关系。关联类和一般类一样表示。分化的是,主类和关联类之间用一条相交的点线连接。图
11 突显一个航空工业实例的涉及类。

betvictor1946 21

betvictor1946 22

图 11:增添关联类 MileageCredit

图 11:增添关联类 MileageCredit

在图 11 中展现的类图中,在Flight类和 FrequentFlyer
类之间的关联,暴发了名叫
MileageCredit的关联类。那代表当Flight类的一个实例关联到 FrequentFlyer
类的一个实例时,将会时有暴发 MileageCredit 类的一个实例。

在图 11 中显得的类图中,在Flight类和 FrequentFlyer
类之间的涉及,爆发了名为
MileageCredit的关联类。这意味当Flight类的一个实例关联到 FrequentFlyer
类的一个实例时,将会发出 MileageCredit 类的一个实例。

聚合 
会晤是一种专门类型的涉嫌,用于描述“总体到部分”的涉及。在焦点的聚合关系中, 部分类 的生命周期独立于 整体类 的生命周期。

聚合
会聚是一种专门类型的涉嫌,用于描述“总体到部分”的涉及。在主导的集纳关系中,
部分类 的生命周期独立于 整体类 的生命周期。

比喻来说,大家可以想象, 是一个完完全全实体,而 车轮 轮胎是整辆车的一有的。轮胎可以在安置到车时的前多少个礼拜被打造,并放置于仓库中。在那些实例中,Wheel类实例清楚地单独地Car类实例而留存。但是,有些情形下, 部分 类的生命周期并  独立于 整体 类的生命周期

那称为合成聚合。举例来说,考虑集团与单位的关系。 供销社和机关 都建模成类,在信用社存在之前,部门不可以存在。那里Department类的实例爱护于Company类的实例而存在。

让大家更进一步追究基本聚合和构成聚合。

骨干聚合 
有汇集关系的涉嫌提出,某个类是此外某个类的一部分。在一个集合关系中,子类实例可以比父类存在更长的年华。为了突显一个汇合关系,你画一条从父类到一些类的实线,并在父类的涉及末端画一个未填充棱形。图
12 突显车和轮胎间的集纳关系的事例。

betvictor1946 23

图 12: 一个集合关联的例证

组成聚合 
组合聚合关系是聚众关系的另一种格局,可是子类实例的生命周期看重于父类实例的生命周期。在图13中,彰显了Company类和Department类之间的三结合关系,注意组合关系如聚合关系一样绘制,但是这一次菱形是被填充的。

betvictor1946 24

图 13: 一个结缘关系的例证

在图 13
中的关系建模中,一个Company类实例至少总有一个Department类实例。因为涉嫌是组成关系,当Company实例被移除/销毁时,Department实例也将自动地被移除/销毁。组合聚合的另一个至关首要功效是一些类只可以与父类的实例相关(举例来说,我们例子中的Company类)。

反射关联 
前几天大家早就切磋了有着的涉嫌类型。就像你也许注意到的,我们的富有例子已经显示了三个不一样类之间的关系。但是,类也得以使用反射关联与它自己相关联。先河,那恐怕没有意义,可是切记,类是空虚的。图
14 显示一个Employee类怎么着通过manager /
manages角色与它自己有关。当一个类关联到它自身时,那并不代表类的实例与它自己有关,而是类的一个实例与类的另一个实例相关。

betvictor1946 25

图 14:一个反光关联关系的实例

图 14
描绘的涉及说可瑞康个Employee实例可能是其它一个Employee实例的经营。可是,因为“manages”的涉及角色有
0..*的多重性描述;一个雇员可能不受任何其余雇员管理。

可见性 
在面向对象的筹划中,存在属性及操作可知性的标志。UML
识别各个档次的可知性:public,protected,private及package。

UML
规范并不须求质量及操作可知性必须出示在类图上,但是它必要为每个属性及操作定义可知性。为了在类图上的突显可见性,放置可知性标志于属性或操作的名字从前。尽管UML 指定三种可知性类型,不过实际上的编程语言可能扩张额外的可知性,或不协理UML 定义的可见性。表4突显了 UML 援救的可知性类型的例外标志。

表 4:UML 帮助的可知性类型的注脚

标志 可见性类型
+ Public
# Protected
Private
~ Package

现今,让大家看一个类,以证实属性及操作的可知性类型。在图 15
中,所有的品质及操作都是public,除了 updateBalance 操作。updateBalance
操作是protected。

betvictor1946 26

图 15:一个 BankAccount 类说明它的属性及操作的可知性


回页首

UML
2 补充

既是我们早已覆盖了根基和高档焦点,大家将覆盖一些由UML 1.
x扩展的类图的新标志。

实例 
当一个系统结创设模时,展现例子类实例有时候是实用的。为了那种布局建模,UML
2
提供 实例规范 元素,它显得在系统中动用例子(或具体)实例的值得注意的消息。

实例的符号和类一样,但是代表顶端区域中仅局地类名,它的名字是由此拼接的:

Instance Name : Class Name

举例来说:

Donald : Person

因为体现实例的目标是显得值得注意的或有关的音讯,没必要在你的模型中包蕴全体实体性质及操作。相反地,仅仅呈现感兴趣的品质及其值是一心适用的。如图16所描述。

betvictor1946 27

图 16:Plane类的一个实例例子(只彰显感兴趣的属性值)

不过,仅仅展现一些实例而从未它们的涉及不太实用;因而,UML 2
也同目的在于实体层的关联/关联建模。绘制关联与一般的类关系的规则一样,除了在建模关联时有一个增大的渴求。附加的限定是,关联关系必须与类图的关联相平等,而且波及的角色名字也亟须与类图相平等。它的一个例证突显于图
17 中。在这么些事例中,实例是图 6 中类图的事例实例。

betvictor1946 28

图 17:图 6 中用实例代替类的例证

图 17
有Flight类的二个实例,因为类图提出了在Plane类和Flight类之间的关联是 0或多。因而,我们的事例给出了三个与NX0337
Plane实例相关的Flight实例。

角色 
建模类的实例有时比期望的进一步详细。有时,你恐怕不过想要在一个较多的相似层次做类关系的模子。在那种意况下,你应该运用 角色 记号。角色记号类似于实例记号。为了树立类的角色模型,你画一个方格,并在其中放置类的角色名及类名,作为实体记号,不过在这情状你不可能加下划线。图
18 呈现一个由图 14 中图描述的雇员类扮演的角色实例。在图 18
中,我们可以认为,就算雇员类与它本身有关,关系实在是关于雇员之间扮演首席执行官及团队成员的角色。

betvictor1946 29

图 18:一个类图突显图14中饰演不同角色的类

留意,你不可以在纯粹类图中做类角色的建模,即便图
18来得你能够如此做。为了拔取角色记号,你将会必要使用上边商量的内部结构记号。

其中的布局 
UML 2
结构图的更实用的成效之一是新的内部结构记号。它同意你浮现一个类或其余的一个分类器怎样在中间整合。那在
UML 1. x
中是不容许的,因为记号限制你只好突显一个类所独具的集合关系。现在,在 UML
2 中,内部的协会记号让您更明了地显示类的逐一部分如何保持关系。

让大家看一个实例。在图 18
中大家有一个类图以表现一个Plane类如何由三个引擎和五个控制软件对象组成。从这一个图中省略的事物是浮现关于飞机部件怎样被装配的一些新闻。从图
18
的图,你不能表达,是各种控制软件对象说了算三个引擎,仍旧一个控制软件对象说了算多少个引擎,而另一个操纵一个引擎。

betvictor1946 30

图 19: 只显示对象时期涉及的类图

绘制类的内在结构将会革新那种情景。初步时,你通过用二个区域画一个方格。最上端的区域包含类名字,而较低的区域包涵类的内部结构,显示在它们父类中肩负不一样角色的部分类,角色中的每个部分类也关系到其余类。图
19 展现了Plane类的内部结构;注意内部结构如何澄清混乱性。

betvictor1946 31

图 20:Plane类的内部结构例子。

在图 20 中Plane有八个ControlSoftware 对象,而且每个控制二个引擎。在图左侧上的
ControlSoftware(control1)控制引擎 1 和 2 。在图右边的
ControlSoftware(control2)控制引擎 3 和 4 。 

举例来说来说,大家得以设想, 是一个完整实体,而 车轮
轮胎是整辆车的一有些。轮胎可以在安放到车时的前多少个礼拜被创设,并放置于仓库中。在那个实例中,Wheel类实例清楚地单独地Car类实例而留存。可是,有些景况下,
部分 类的生命周期并 独立于 整体 类的生命周期 —
那称为合成聚合。举例来说,考虑集团与单位的关系。 商家和机关
都建模成类,在铺子存在从前,部门不可能存在。那里Department类的实例依赖于Company类的实例而存在。

让大家更进一步探索基本聚合和烧结聚合。

主导聚合
有会聚关系的关联提议,某个类是别的某个类的一有些。在一个聚集关系中,子类实例可以比父类存在更长的日子。为了展现一个聚众关系,你画一条从父类到有些类的实线,并在父类的关系末端画一个未填充棱形。图
12 显示车和轮胎间的集结关系的事例。

betvictor1946 32

图 12: 一个汇聚关联的事例

结缘聚合
组合聚合关系是会面关系的另一种情势,不过子类实例的生命周期看重于父类实例的生命周期。在图13中,显示了Company类和Department类之间的咬合关系,注意组合关系如聚合关系一样绘制,但是这一次菱形是被填充的。

betvictor1946 33

图 13: 一个构成关系的例子

在图 13
中的关系建模中,一个Company类实例至少总有一个Department类实例。因为关乎是组成关系,当Company实例被移除/销毁时,Department实例也将自动地被移除/销毁。组合聚合的另一个重视职能是有些类只可以与父类的实例相关(举例来说,咱们例子中的Company类)。

反射关联
近日我们早就探究了具有的涉嫌类型。就像你也许注意到的,大家的保有例子已经显得了三个不相同类之间的关系。可是,类也可以采纳反射关联与它自身相关联。初叶,那说不定没有意义,不过切记,类是空虚的。图
14 突显一个Employee类怎么样通过manager /
manages角色与它自己有关。当一个类关联到它自身时,这并不意味着类的实例与它自己有关,而是类的一个实例与类的另一个实例相关。

betvictor1946 34

图 14:一个反光关联关系的实例

图 14
描绘的涉及说爱他美(Karicare)(Friso)个Employee实例可能是别的一个Employee实例的经纪。不过,因为“manages”的关系角色有
0..*的多重性描述;一个雇员可能不受任何别的雇员管理。

可见性
在面向对象的规划中,存在属性及操作可知性的标记。UML
识别七种档次的可知性:public,protected,private及package。

UML
规范并不必要性能及操作可知性必须出示在类图上,可是它须求为各类属性及操作定义可见性。为了在类图上的浮现可知性,放置可知性标志于属性或操作的名字此前。即使UML 指定八种可知性类型,然而实际上的编程语言可能增添额外的可知性,或不扶助UML 定义的可知性。表4呈现了 UML 帮助的可知性类型的不等标志。

表 4:UML 辅助的可知性类型的注脚

标志 可见性类型
+ Public
# Protected
Private
~ Package

目前,让大家看一个类,以评释属性及操作的可知性类型。在图 15
中,所有的特性及操作都是public,除了 updateBalance 操作。updateBalance
操作是protected。

betvictor1946 35

图 15:一个 BankAccount 类表达它的习性及操作的可知性


回页首

UML 2 补充

既是大家曾经覆盖了基础和高档主题,大家将覆盖一些由UML 1.
x增加的类图的新标志。

实例
当一个系统结创设模时,突显例子类实例有时候是行得通的。为了那种布局建模,UML
2 提供 实例规范
元素,它突显在系统中运用例子(或具体)实例的值得注意的信息。

实例的标志和类一样,可是代表顶端区域中仅局地类名,它的名字是经过拼接的:

Instance Name : Class Name

举例来说来说:

Donald : Person

因为突显实例的目标是浮现值得注意的或相关的消息,没需要在您的模子中带有全部实体性质及操作。相反地,仅仅突显感兴趣的性质及其值是全然适用的。如图16所讲述。

betvictor1946 36

图 16:Plane类的一个实例例子(只显示感兴趣的属性值)

只是,仅仅展现有些实例而从不它们的涉嫌不太实用;由此,UML 2
也允许在实体层的涉及/关联建模。绘制关联与一般的类关系的规则一样,除了在建模关联时有一个增大的渴求。附加的限量是,关联关系必须与类图的涉及相平等,而且波及的角色名字也无法不与类图相平等。它的一个例子显示于图
17 中。在这些例子中,实例是图 6 中类图的事例实例。

betvictor1946 37

图 17:图 6 中用实例代替类的例证

图 17
有Flight类的二个实例,因为类图指出了在Plane类和Flight类之间的关联是
0或多。由此,大家的事例给出了三个与NX0337 Plane实例相关的Flight实例。

角色
建模类的实例有时比期望的愈来愈详细。有时,你可能仅仅想要在一个较多的貌似层次做类关系的模子。在那种状态下,你应有使用
角色
记号。角色记号类似于实例记号。为了建立类的角色模型,你画一个方格,并在里边放置类的角色名及类名,作为实体记号,可是在这景观你不能加下划线。图
18 突显一个由图 14 中图描述的雇员类扮演的角色实例。在图 18
中,我们得以认为,固然雇员类与它自己有关,关系真正是关于雇员之间扮演首席营业官及协会成员的角色。

betvictor1946 38

图 18:一个类图突显图14中饰演分化角色的类

小心,你不可能在纯粹类图中做类角色的建模,尽管图
18显示你可以那样做。为了选用角色记号,你将会必要动用上边研讨的内部结构记号。

里面的社团
UML 2
结构图的更使得的机能之一是新的内部结构记号。它同意你来得一个类或其它的一个分类器怎么着在内部整合。那在
UML 1. x
中是不容许的,因为记号限制你不得不展现一个类所怀有的汇集关系。现在,在 UML
2 中,内部的结构记号让你更明亮地出示类的次第部分如何保持关系。

让大家看一个实例。在图 18
中大家有一个类图以表现一个Plane类如何由七个引擎和五个控制软件对象组成。从这一个图中省略的东西是显得关于飞机部件怎么样被装配的一部分音讯。从图
18
的图,你无法表明,是各类控制软件对象说了算五个引擎,依旧一个控制软件对象说了算八个引擎,而另一个决定一个发动机。

betvictor1946 39

图 19: 只突显对象时期涉及的类图

绘制类的内在结构将会创新那种境况。先河时,你通过用二个区域画一个方格。最上方的区域包蕴类名字,而较低的区域包蕴类的内部结构,突显在它们父类中顶住不相同角色的一对类,角色中的每个部分类也论及到任何类。图
19 体现了Plane类的内部结构;注意内部结构如何澄清混乱性。

betvictor1946 40

图 20:Plane类的内部结构例子。

在图 20 中Plane有八个 ControlSoftware
对象,而且每个控制二个引擎。在图左侧上的
ControlSoftware(control1)控制引擎 1 和 2 。在图左侧的
ControlSoftware(control2)控制引擎 3 和 4 。


回页首

结论

起码存在三个精通类图的基本点理由。第三个是它显得系统分类器的静态结构;首个理由是图为UML描述的其余社团图提供了主题记号。开发者将会觉得类图是为她们专程创设的;不过任何的集体成员将发现它们也是卓有成效的。业务分析师可以用类图,为系统的事务远景建模。正如大家将会在本连串有关
UML 基础的篇章中见到的,其他的图 —
蕴含活动图,种类图和状态图——参考类图中的类建模和文档化。

关于“UML 基础”的本种类的末尾的构件图。


回页首

脚注

1
delayFlight没有再次回到值,因为我作出了规划决定,不要再次来到值。有几许足以争辩的是,延迟操作应该回到新的抵达时刻,而且,假如是这种情景,操作属性将浮现为
delayFlight(numberOfMinutes : Minutes) : Date。

2也许看起来很奇怪, BankAccount 类不领悟OverdrawnAccountsReport
类。这几个建模使报表类可以领略它们报告的业务类,可是事情类不知道它们正在被报告。那解开五个对象的耦合,并就此使系统变得更能适应变化。

3
软件包对于社团你的模子类是高大的,不过切记主要的少数是,你的类图应该是有关建模系统的不难交换的新闻。在您的软件包有广大类的动静下,最好使用多个要旨类图,而不是不过发生一个大的类图。

4
要驾驭首要一点,当自己说“所有的那么些成员”时,我偏偏意味着在眼前图中的类将展现出来。突显一个有内容的软件包的图,不需求出示它的享有内容。它可以根据一些规则,突显包含元素的子集,那一个规则就是不用所有的软件包分类器都是必需的。

5 当画一个类图时,在 UML
规范中,全体要做的只是把类放入长方形的顶部区域,而你同理处理接口;不过,UML
规范认为,在这些区域放置“class”文本是可选的,如若类没有呈现,那么它应有被要是。

 

相关文章