提供了两种术语:
结构化地表达客观事物的术语表达客观事物之间关系(相互作用相互影响)的术语除此之外还有:
为了控制信息组织的复杂性,还引入了用于组织特定对象结构的包。为了使建造的系统模型容易理解,引入了注解。 6.3 结构化表达客观事物的术语 6.3.1 类与对象 类(Class):一组具有相同属性、操作、关系和语义的对象的描述。对象(object):对象是类的一个实例。类的结构:
类的简化表示:
①
②
③
抽象类用斜体表示:
类名:
类名使用黑体字,第一个字母通常大写,并位于第一栏的中间。类名往往是从正被建模系统的词汇表中提取的简单名词或名词短语。属性:
一个属性往往具有所属的类型、用于描述该特性的实例可以取值的范围。类的一个对象对每个属性赢有特定的值。一个类可以有多个属性,也可以没有属性。属性的作用范围:
实例范围的属性:属性的其他方面相同,但属性值随程序的执行而变化。类范围的属性:对于任何对象实例属性值都相同,即“静态”。定义属性的格式:
[可见性] 属性名 [:类型] [多重性] [=初始值] [{特性串}]① 可见性:
+公有的(public):可供其他类使用。#受保护的(protected):其子类可使用。-私有的(private):只有本类的操作才能使用。~包内的(package):只有在同一包中声名的类才能使用。② 属性名:
通常以小写字母开头,左对齐。③ 类型:
与具体实现语言有关,如 name: string,表示name这个属性名的类型为字符串string④ 多重性:
表示属性值的数目,如 points[2…*]:Point⑤ 初始值:
用于为新建立的对象赋予初始值,如 origin:Point=(0,0)⑥ 特性串:
表达该属性所具有的性质,如 a:integer=1{frozen},表示属性不可改变操作:
① 一个类可以有多个操作,也可以没有操作。
② 操作名除第一个词外,其他每个词的第一个字母要大写。
③ 操作名往往是描述其所在类的行为动词或动词短语。
④ 也可以通过给出操作的特征标记进一步描述之,如参数名、类型、默认值,返回类型等。
⑤ 可以是抽象操作,即没有给出实现的操作,用斜体表示(即C++中的纯虚操作)。
⑥ 调用一个对象上的操作可能会改变该对象的数据或状态。
⑦ 操作的作用范围分为类范围操作和实例范围操作。
定义操作的格式:
[可见性] 操作名 [(参数表)] [:返回类型] [{特性串}]① 可见性:
+公有的(public):可供其他类使用。#受保护的(protected):其子类可使用。-私有的(private):只有本类的操作才能使用。~包内的(package):只有在同一包中声名的类才能使用。② 操作名:
一般为动词或动词短语,以小写字母开头,左对齐。如果是动词短语,除第一个词外,其余首字母均大写。抽象操作用斜体表示。③ 参数表:
参数名:类型 [=默认值] 方向:in(输入参数,不能修改)、inout(输入参数,用于与调用者进行信息通讯,可能要更改)、out(输出参数,用于与调用者进行信息通讯,可能要更改)。类型:用最终的目标语言表示。默认值:用最终的目标语言表示。④ 返回类型:
与具体的实现语言有关,如果没有返回值(void),就省略冒号和返回类型。需要多个返回值时,可使用表达式列表。操作的多态性:
6.3.2 接口 是一组操作的集合,其中每个操作描述了类或构件的一个服务。作用:模型化系统中的“接缝”。表示:
用带有分栏和关键字interface的矩形符号<<>>来表示。在操作分栏中给出接口支持的操作列表。接口的属性分栏总是空的。用小圆圈来表示接口:
举例:
“销售”接口是“商品”类的供接口,是“售货员”类的需接口。“商品”类实现了“销售”接口,“售货员”类使用“销售”接口。 6.3.3 协作 协作是一组类、接口和其他元素的群体,他们共同工作以提供比各组成部分的总和和更强的合作行为。表示:
6.3.4 用况 体现了功能抽象,是对一组动作序列的描述,系统执行这些动作产生对特定的参与者一个有值得、可观察的结果。表示:
6.3.5 主动类 体现并发行为抽象,是一种至少具有一个进程或线程的类,因此它能够启动控制活动。表示:
6.3.6 构件 是系统中逻辑的并且可替换的成分,它遵循并提供了一组接口的实现。表示:
6.3.7 制品 是系统中物理的、可替代的部件,其中包含物理信息(比特)。表示:
6.3.8 节点 是在运行时存在的物理元素,通常它表示一种具有记忆能力和处理能力的计算机资源。表示:
6.4 控制复杂性的术语 6.4.1 包目的和语义:
为了组织类目,控制信息组织和文档组织的复杂性,UML引入了术语“包”。包是模型元素的一个分组。一个包本身可以被嵌套在其他包中,并且可以含有子包和其他种类的模型元素。表示:
在大矩形中描述包的内容,而把该包的名字放在左上角的矩形中。 可以把所包含的元素画在包的外面,将元素与该包相连。这时可把该包的名字放在大矩形中。包之间的关系:
两种依赖:访问依赖和引入依赖。作用:使一个包可以访问和引入其他包。包间的依赖通常隐含了各包中元素间存在的一个或多个依赖。 引入依赖 从源包到目标包的引入依赖表明:目标包中有适当可见性的内容被加入到源包的公共命名空间,相当于源包对它们做了声明(即,不需要一个路径名)。 访问依赖 从源包到目标包的访问依赖表示:目标包中具有可见性的内容增加到源包的私有命名空间里(即,源包可以不带限定名来引用目标包中的内容,但不可以输出之,如果第三个包引入源包,就不能再输出已经被引入的目标包元素)。对成组的元素建模策略:
浏览特定体系结构,视图里面的建模元素,找出概念和语义上相近的元素所定义的组块, 把这样的一些块放到一个包里。对每个包判别哪些元素要在包外访问, 把这些元素标记为公共的,把其他元素标记为受保护的或者私有的。用引入依赖关系显式地连接建立在其他包之上的包。在包的家族里面,用泛化关系把特殊包连接到一般包里面。 6.5 表达关系的术语 6.5.1 关联定义:
关联是类目之间的结构关系,描述了一组具有相同结构、相同语义的链。连接两个类目的关联称为二元关联,连接n个类目的关联称为n元关联。多重性:
类中对象参与一个关联的数目,称为该关联角色的多重性。聚合:
一种特殊形式的关联,表达一种“整体/部分”关系。即一个类表示了一个大的事物,它是由一些小的事物(部分)组成。组合:
如果整体类的实例和部分类的实例具有相同的生命周期,这样的聚合称为组合。限定符:
一个限定符是一个关联的属性或属性表,这些属性的值将对该关联对象集做了一个划分。关联类:
它有关联和类的特性。一个关联类,可以被看做是一个关联,但还有类的特性;或被看做是一个类,但有关联的特性。 6.5.2 泛化定义:
一个类可以有0个,1个或多个父类。没有父类且最少有一个子类的类被称为根类或基类。没有子类的类称为叶子类。如果一个类只有一个父类,则说明它使用了单继承,如果一个类有多个父类,则说它使用了多继承。表示方法:
6.5.3 实现定义:
实现是类目之间的一种语义关系,其中一个类目规约了保证另一个类目执行的契约。使用地方:
借口与实现它们的类和构建之间。用况与实现它们的协作之间。表示:
6.5.4 依赖定义:
依赖是一种使用关系,用于描述一个事物(如类Windows)使用另一事物(如类Event)的信息和服务。 6.6 UML模型表达工具 6.6.1 静态建模-类图定义:
类图显示了类(及其接口)、类的内部结构以及与其他类的联系,是面向对象分析和设计所得到的最重要的模型,用于可视化的表达系统的静态结构模型。类图包含的内容:
通常包含:类、接口、依赖、泛化、和关联关系等。特殊情况下可包含注解和约束,以及包或子系统,甚至,可包含一个实例,以便使其可视化。示例:
创建类图四步骤:
① 对系统中的概念(词汇)建模,形成类图中的基本元素。
使用术语“类”来抽象系统的各个组成部分、系统环境,而后确定每一个类的责任,最终形成类图中的模型元素。② 对待建系统中的各种关系建模。
使用表达关系的术语,例如关联、泛化和依赖等抽象系统中各成分之间的关系,形成该系统的初始类图。 当需要从一个类的对象到另一个类的对象导航时,就建立“关联”,如下: 当一个类的对象要与另一个类的对象相互交互,而后者不作为前者的过程局部变量或操作参数,就建立“关联”。 如果关联中的一个类与另一端的类相比,前者在结构或者组织上是一个整体,后者看来像它的部分,则在靠近整体的一端用一个菱形对关联修饰,表示“聚合”。 对于每一个关联,都要说明其多重性(特别当多重性不为*时,星号是默认的多重性)。③ 模型化系统中的协作,给出该系统的最终类图。
泛化与依赖:
依赖关系是使用关系,常见的依赖关系是两个类之间的连接,其中一个类只是使用另一个类作为它的操作参数。 泛化关系是“is a kind of”关系,在对系统的词汇建模中,经常遇到结构或行为上与其他类相似的类,可以提取所有共同的结构特征和行为特征,并把它们提升到一般的类中,特殊类继承这些特征。 6.6.2 动态建模-用况图示例:
6.6.3 系统行为(交互)建模-顺序图定义:
顺序图是一种交互图,即由一组对象以及这些对象之间的关系(通信)组成,其中还包含这些对象之间被发送的消息。示例:
6.6.4 系统行为(生存周期)建模-状态图定义:
状态图是显示一个状态机的图,其中强调了从一个状态到另一状态的控制流。规约了一个对象在其生存期间因响应事件并作出响应而经历的状态。示例:
6.7 总结(完)