类之间的关系 1. 泛化 类之间的关系包括泛化(——|>)、关联(——)和依赖(------à)三种。 泛化指的就是继承关系,它是从父类(超类)的角度来讲的。 2. 类之间的关联 关联的含义:通过属性来表示一个对象对另一个对象的静态依赖关系。 首先,关联是对象间的;另外,关联是一种静态的关系,而不是通过操作。 关联的三种表现形式: 连接:—— 最弱的关联,表示两个类的对象之间有导航关系,即。 聚合:A◇——B 表示对象A包含一个对象B。 组合:◆—— 强语义耦合,如果整体消失则部分也消失。 3.依赖 依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。 根据这个定义,关联和泛化都是依赖关系,但是它们有更特别的语义,故它们有自己的名字和详细的语义。我们通常用依赖这个词来指其他的关系。 表 4–3 列出了 UML 基本模型中的一些依赖关系。 依赖关系 | 功能 | 关键字 | 访问 | 允许一个包访问另一个包的内容 | access | 绑定 | 为模板参数指定值,以生成一个新的模型元素 | bind | 调用 | 声明一个类调用其他类的操作的方法 | call | 派生 | 声明一个实例可以从另一个实例导出 | derive | 友员 | 允许一个元素访问另一个元素,不管被访问的元素是否具有可见性 | friend | 输入 | 允许一个包访问另一个包的内容并为被访问包的组成部分增加别名 | import | 实例化 | 关于一个类的方法创建了另一个类的实例的声明 | instantiate | 参数 | 一个操作和它的参数之间的关系 | parameter | 实现 | 说明和对这个说明的具体实现之间的映射关系 | realize | 精化 | 声明具有两个不同语义层次上的元素之间的映射 | refine | 发送 | 信号发送者和信号接收者之间的关系 | send | 跟踪 | 声明不同模型中的元素之间存在一些连接,但不如映射精确 | trace | 使用 | 声明使用一个模型元素需要用到已存在的另一个模型元素,这样才能正确实现使用者的功能(包括了调用、实例化、参数、发送) | use |
依赖关系种类 依赖用一个从客户指向提供者的虚箭头表示,用一个构造型的关键字来区分它的种类,如 图 4–11 所示。
类之间的关系 类之间的关系是类图中比较复杂的内容。有关联、聚合、组合、范化、依赖。
关联(associations):是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。如下图所示:
聚合(aggregation):是一种特殊的关联,聚合表示整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如舰队是由一系列的舰船组成。需求描述中“包含”、“组成”、“分为….部分”等词常意味着聚合关系。
组合(composition):也是一种特殊的关联,也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
聚合和组合的区别:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
泛化(Generalization):定义了一般元素和特殊元素之间的分类关系,类之间的这种泛化关系也就是继承关系。泛化关系是“a-kind-of”关系,定义一般元素和特殊元素之间的分类关系。下图是一个泛化关系的例子。
依赖(dependencies):有两个元素如果修改X的定义可能会导致对Y的定义,则认为Y依赖X。依赖关系可能由各种原因引起,如一个类向另一个类发送消息,或者一个类是另一个类的数据成员类型,或者一个类是另一个类的操作的参数类型等。有时依赖关系和关联关系比较难区分。如果类A和类B有关联关系,它们之间必然有依赖关系。如果两个类之间有关联关系时不用再表示出这两个类之间的依赖关系。
|