(转)uml 静态视图关系和关联
· 关系
类元之间的关系有关联、泛化、流及各种形式的依赖关系,包括实现关系和使用关系(参见 表4–2 )。
关联关系描述了给定类的单独对象之间语义上的连接。关联提供了不同类间对象可以相互作用的连接。其余的关系涉及到类元自身的描述,而不是它们的实例。
泛化关系使父类元(超类)与更具体的后代类元(子类)连接在一起。泛化有利于类元的描述,可以不用多余的声明,每个声明都需加上从其父类继承来的描述。继承机制利用泛化关系的附加描述构造了完整的类元描述。泛化和继承允许不同的类元分享属性、操作和它们共有的关系,而不用重复说明。
实现关系将说明和实现联系起来。接口是对行为而非实现的说明,而类之中则包含了实现的结构。一个或多个类可以实现一个接口,而每个类分别实现接口中的操作。
流关系将一个对象的两个版本以连续的方式连接起来。它表示一个对象的值、状态和位置的转换。流关系可以将类元角色在一次相互作用中连接起来。流的种类包括变成(同一个对象的不同版本)和拷贝(从现有对象创造出一个新的对象)两种。
依赖关系将行为和实现与影响其他类的类联系起来。除了实现关系以外,还有好几种依赖关系,包括跟踪关系(不同模型中元素之间的一种松散连接)、精化关系(两个不同层次意义之间的一种映射)、使用关系(在模型中需要另一个元素的存在)、绑定关系(为模板参数指定值)。使用依赖关系经常被用来表示具体实现间的关系,如代码层实现关系。在概括模型的组织单元,例如包时,依赖关系很有用,它在其上显示了系统的构架。例如编译方面的约束可通过依赖关系来表示。
表 4–2 关系的种类
关系 |
功能 |
表示法 |
关联 |
类实例之间连接的描述 |
|
依赖 |
两个模型元素间的关系 |
|
流 |
在相继时间内一个对象的两种形式的关系 |
|
泛化 |
更概括的描述和更具体的种类间的关系,适用于继承 |
|
实现 |
说明和实现间的关系 |
|
使用 |
一个元素需要别的元素提供适当功能的情况 |
· 关联
关联描述了系统中对象或实例之间的离散连接。关联将一个含有两个或多个有序表的类元,在允许复制的情况下连接起来。最普通的关联是一对类元之间的二元关联。关联的实例之一是链。每个链由一组对象(一个有序列表)构成,每个对象来自于相应的类。二元链包含一对对象。
关联带有系统中各个对象之间关系的信息。当系统执行时,对象之间的连接被建立和销毁。关联关系是整个系统中使用的“胶粘剂”,如果没有它,那么只剩下不能一起工作的孤立的类。
在关联中如果同一个类出现不止一次,那么一个单独的对象就可以与自己关联。如果同一个类在一个关联中出现两次,那么两个实例就不必是同一个对象,通常的情况都如此。
一个类的关联的任何一个连接点都叫做关联端,与类有关的许多信息都附在它的端点上。关联端有名字(角色名)和可见性等特性,而最重要的特性则是多重性,重性对于二元关联很重要,因为定义 n 元关联很复杂。
二元关联用一条连接两个类的连线表示。如 图 4–2 所示,连线上有相互关联的角色名而多重性则加在各个端点上。
图 4–2 关联表示法
如果一个关联既是类又是关联,即它是一个关联类,那么这个关联可以有它自己的属性(如 图 4 – 3 )。如果一个关联的属性在一组相关对象中是唯一的,那么它是一个限定符(如图 4-4 )。限定符是用来在关联中从一组相关对象中标识出独特对象的值。限定符对建模名字和身份代码是很重要的,同时它也是设计模型的索引。
图 4–3 关联类
图 4 – 4 限定关联
在分析阶段,关联表示对象之间的逻辑关系。没有必要指定方向或者关心如何去实现它们。应该尽量避免多余的关联,因为它们不会增加任何逻辑信息。在设计阶段,关联用来说明关于数据结构的设计决定和类之间职责的分离。此时,关联的方向性很重要,而且为了提高对象的存取效率和对特定类信息的定位,也可引入一些必要的多余关联。然而,在该建模阶段,关联不应该等于 C++ 语言中的指针。在设计阶段带有导航性的关联表示对一个类有用的状态信息,而且它们能够以多种方式映射到程序设计语言当中。关联可以用一个指针、被嵌套的类甚至完全独立的表对象来实现。其他几种设计属性包括可见性和链的可修改性。 图 4 – 5 表示了一些关联的设计特性。
图 4–5 关联的设计特性
1. 聚集和组成
聚集表示部分与整体关系的关联,它用端点带有空菱形的线段表示,空菱形与聚集类相连接。组成是更强形式的关联,整体有管理部分的特有的职责,它用一个实菱形物附在组成端表示。每个表示部分的类与表示整体的类之间有单独的关联,但是为了方便起见,连线结合在一起,现在整组关联就像一棵树。 图 4 – 6 表示了聚集关联和组成关联。
图 4–6 聚集和组成
2. 链
链是关联的一个实例。链即所涉及对象的一个有序表,每个对象都必须是关联中对应类的实例或此类后代的实例。系统中的链组成了系统的部分状态。链并不独立于对象而存在,它们从与之相关的对象中得到自己的身份(在数据库术语中,对象列表是链的键)。在概念上,关联与相关类明显不同。而在实际中,关联通常用相关类的指针来实现,但它们可以作为与其相连的类分离的包含体对象来实现。
3. 双向性
关联的不同端很容易辨认,哪怕它们都是同一种类。这仅仅意味着同一个类的不同对象是可以相互联系的。正是因为两端是可区分的,所以关联是不对称的(除了个别的例子外),且两个端点也是不能互相交换的。在通常情形下这是一个共识:就像动词短语中的主语和宾语不能互换一样。关联有时被认为是双向性的,这意味着逻辑关系在两个方向上都起作用。这个观点经常被错误理解,甚至包括一些方法学家。这并不意味着每个类“了解”其他类,或者说在实现中类与类之间可以互相访问。这仅仅意味着任何逻辑关系都有其反向性,无论这个反向性容不容易计算。如果关联只在一个方向横穿而不能在另一个方向横穿,那么关联就被认为有导航性。
为什么使用基本模型,而不用编程语言中流行的指针来表示关联?原因是模型试图说明系统实现的目的。如果两个类之间的关系在模型中用一对指针来表示,那么这两个指针仍然相关。关联方法表明关系在两个方向都有意义,而不管它们是如何实现的。将关联转化成一对用于实现的指针很容易,但是很难说明这两个指针是彼此互逆的,除非这是模型的一部分。