3.9 UML关系
3.9.1 关联关系(assocration)
关联关系的图像表示
举例
关联关系和依赖关系的不同
关联关系在代码中的体现
关联关系的多重性
举例: 父子结构
3.9.2 依赖关系(dependency)
依赖关系的图形
依赖关系和关联关系的不同
举例说明
依赖代码里的体现
使用关联关系的情况
使用依赖关系的情况
杜绝双向依赖
3.9.3 扩展关系(extends)
3.9.4 包含关系(include)
3.9.5 实现关系(realize)
3.9.6 精化关系(refine)
3.9.7 泛化关系(generalization)
3.9.8 聚合关系(aggregation)
聚合 整体不存 部分仍在
3.9.9 组合关系(composition)
组合 整体不存 部分也不存
3.9 UML关系
在UML
中,关系是非常重要的语义,它抽象出对象之间的联系,让对象构成某个特定的结构。本节将列举出UML
所定义的关系,并解释它们的语义。
3.9.1 关联关系(assocration)
关联关系的图像表示
关联关系是用一条直线表示的
它描述不同类的对象之间的结构关系,关联关系是一种静态关系
,通常与运行状态无关,而是由”常识”、”规则”、”法律”等因素决定的,所以关联关系是一种”强关联”的关系。
举例
例如,
- 公司与员工之间一对多就是一种符合”常识”的关系;
- 乘车人和车票之间的一对一关系是符合”规则”的关系;
- 公民和身份证之间的一对一关系是符合”法律”的关系;
关联关系和依赖关系的不同
关联关系用来定义对象之间静态的、天然的结构。这与依赖关系是不同的,依赖关系表达的是对象之间临时性的、动态的关系。
关联关系在代码中的体现
在最终的代码里,关联对象通常是以实例变量(成员变量
)的形式实现的。
与依赖相比,关联的两个对象之间通常不会相互直接使用,尽管它们相互”知道”对方的存在,但一般都是由外部对象来访问的,如一个外部访问者可以通过员工对象获得公司对象。
关联关系的多重性
关联关系具有多重性,常见为一对一关联
、一对多关联
、多对多关联
等,也可以是任意多重性关联
,如*
对*
关联(*代表任意数)。
举例: 父子结构
例如对象之间的父子
结构,如果是无方向的,表明父子对象相互拥有对方的实例变量
;如果是有方向的,如父到子,则表明父对象有子对象的实例变量,但子对象没有父对象的实例变量。
3.9.2 依赖关系(dependency)
依赖关系的图形
依赖关系是用一条带箭头的虚线表示的,如果箭头从A指向B,则表示A依赖B。
依赖关系描述了一个对象在运行期会使用
到另一个对象这样的关系
依赖关系和关联关系的不同
与关联关系不同的是,依赖关系是一种临时性
的关系,它通常都是在运行期
产生,并且随着运行场景的不同,依赖关系也可能发生变化。
举例说明
例如人
和船
这两个对象,
- 如果运行场景是开动轮船,那么轮船依赖于人(水手);
- 如果场景变为渡海,那就变成人依赖于船了。
可见,依赖关系是一种”弱”关系,它不是天然存在的,并且会随着运行场景的变化而变化。
如人和刀这两个对象,平时它们是没有关系的,但在削苹果这个场景里,人依赖于刀;脱离了这个场景,或者说当场景结束后,依赖关系也就不存在了。
依赖代码里的体现
一般而言,依赖关系在最终的代码里体现为**类构造方法、类方法等的传入参数
**。与关联关系相比,依赖关系除了临时”知道”对方外,还会”使用”对方的属性或方法。从这个角度讲,被依赖的对象改变会导致依赖对象的修改。
使用关联关系的情况
A对象对B对象没有操作,这时A仅仅是”知道”B对象,并且B修改了方法后,A并不变化,则使用关联关系。
使用依赖关系的情况
如果A对象在某个场景当中使用了B对象的属性或方法,则B的修改会导致A的修改,这时A依赖于B,要使用关联关系.
杜绝双向依赖
同样的,依赖也有单向依赖和双向依赖之分。但是依赖关系却不像关联关系那样有带箭头和不带箭头的区分,统统都是带箭头的。这是因为在面向对象里,双向依赖是一种非常不好的结构,我们总是应当保持单向依赖,杜绝双向依赖关系的产生
3.9.3 扩展关系(extends)
3.9.4 包含关系(include)
这两个关系主要用在用例图,先留着,有空再看
3.9.5 实现关系(realize)
实现关系是用一条带空心三角形箭头的虚线表示的
3.9.6 精化关系(refine)
精化关系先省略,用到再说
3.9.7 泛化关系(generalization)
泛化关系是用一条带空心三角形箭头的直线表示的,
泛化关系可用于建模过程中的任意一个阶段,说明两个对象之间的继承关系
,泛化关系表示一个类对另一个类的继承。
3.9.8 聚合关系(aggregation)
聚合关系是用一条带空心菱形箭头的直线表示的.
聚合关系用于类图,特别用于表示实体对象之间的关系,**表达整体由部分构成
**的语义。例如个部门由许多人员构成。
聚合 整体不存 部分仍在
与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在。例如部门撤销以后,人员不会因此而消失,他们依然存在。
3.9.9 组合关系(composition)
组合关系是用一条带实心菱形箭头的直线表示的
组合关系用于类图,特别用于表示实体对象关系,表达整体拥有
部分的语义。例如母公司拥有许多子公司。
组合 整体不存 部分也不存
组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也将消亡。例如母公司解体了,子公司也将不再存在。